Content Subscriber Timer Job Error “A content type failed to be syndicated: System.Xml.Schema.XmlSchemaValidationException”


Introduction

We are using SharePoint’s Managed Metadata Service Application’s Content Type Hub model to manage the Content Types and Site Columns.

I’d highly recommend the following Technet Article for more information, Plan to share terminology and content types

Anyway, the approach to adding new metadata to the Content Types is using Feature Upgrading which has been interesting and has caused a few problems, which I have blogged about in the past.

Whilst researching the different options for the upgrade process I stumbled over a problem when using PowerShell to add a field to the Site Collection. This problem really only appears when you are using the Field within a Content Type that is being published to other site collections as part of a Content Type Hub.

The PowerShell worked and the Site Column was successfully created using the method. SPFieldCollection.AddFieldAsXml() function. However, when it came to pushing the changes out to the other site collections using the Managed Metadata’s Content Type Subscriber timer job the following errors were logged to the SharePoint ULS Log:-

  • “The element ‘FieldTemplate’ in namespace ‘urn:deployment-manifest-schema’ has invalid child element ‘Field’ in namespace ‘http://schemas.microsoft.com/sharepoint/’. List of possible elements expected: ‘Field’ in namespace ‘urn:deployment-manifest-schema’.”
  • “Received an error message from import: The element ‘FieldTemplate’ in namespace ‘urn:deployment-manifest-schema’ has invalid child element ‘Field’ in namespace ‘http://schemas.microsoft.com/sharepoint/’. List of possible elements expected: ‘Field’ in namespace ‘urn:deployment-manifest-schema’.. The recommendation is:”
  • “A content type failed to be syndicated: System.Xml.Schema.XmlSchemaValidationException: The element ‘FieldTemplate’ in namespace ‘urn:deployment-manifest-schema’ has invalid child element ‘Field’ in namespace ‘http://schemas.microsoft.com/sharepoint/’. List of possible elements expected: ‘Field’ in namespace ‘urn:deployment-manifest-schema’.    “

Investigation

The investigation started by looking at the process of adding the field to SharePoint.

The process being used is as follows:-

  • Load a SharePoint Elements file which has fields defined in it.
  • An example of the element.xml file is shown below
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">

<Field ID="{38384FAD-5BF2-42D6-9243-5BE95F17E5FD}" Type="Text" Name="ITSPFieldName" StaticName="ITSPFieldName" DisplayName="iThink SharePoint Field" Description="Field does something" Group="iThink SharePoint Site Columns" />

</Elements>

 
  • Load the file into PowerShell using the Get-Content Cmdlet
  • Get a reference to the Content Type Hub using Get-SPSite
  • Get the <Field /> element
  • Add a field using the <Field />element and the Site Collection’s Root Web Fields property and AddFieldAsXml() function

Here is a snippet of the PowerShell script that was being executed to do the above:-

$contenttypehub = Get-SPSite -Identity http://sharepoint/hub;
[xml]$elementFile = Get-Content .\myelement.xml;
$fieldXml = $elementFile.Elements.Field[0];
$addedFieldName = $contenttypehub.RootWeb.Fields.AddFieldAsXml($fieldXml.OuterXml);
if($addedFieldName -ne $null)
{
Write-Host "Added Field with InternalFieldName: " $addedFieldName;
}
else {
Write-Warning "Failed to Add Field with Xml: " $fieldXml.OuterXml;
}

Once the script has run then the field is created and is available for assigning to the Content Type. The field is added to the Content Type successfully. However as mentioned previously when the Content Type Subscriber Hub Timer job is run then the errors are displayed about the Field’s SchemaXml .

So what’s going wrong?

Well after examining the Field’s SchemaXml property, I could see the issue.

The field’s schema was displayed using the following script:-

$fieldName = "FOSScannedDocumentId";
$contenttypehub = Get-SPSite -Identity http://sharepoint/hub;
$checkField = $contenttypehub.RootWeb.Fields | ?{$_.InternalName -like $fieldName};
$checkField.SchemaXml;

The output of the command showed the Field’s Schema Xml had an added Element as shown below:-


<Field ID="{38384FAD-5BF2-42D6-9243-5BE95F17E5FD}" Type="Text" Name="ITSPFieldName" StaticName="ITSPFieldName" DisplayName="iThink SharePoint Field" Description="Field does something" Group="iThink SharePoint Site Columns"  xmlns="
http://schemas.microsoft.com/sharepoint/" />

So what was happening, well PowerShell is being well behaved and adding the namespace attribute from the parent <Elements> node to this child node. Unfortunately SharePoint is not expecting this additional attribute as part of the Field’s SchemaXml and it causes the validation of the Xml to fail. Hence the XmlSchemaValidationException.

Solution

The solution was to modify the string being passed into the AddFieldFromXml() function.

This was achieved by modifying the script to remove the xmlns attribute :-


$removeNamespaceString = 'xmlns="http://schemas.microsoft.com/sharepoint/"';
[xml]$elementFile = Get-Content .\myelement.xml;
$fieldXml = $elementFile.Elements.Field[0];
$fieldXmlString = $fieldXml.OuterXml.Replace($removeNamespaceString, "");
$addedFieldName = $contenttypehub.RootWeb.Fields.AddFieldAsXml($fieldXmlString);

This script will find the string with attribute name of xmlns and replace it with a blank string.

Now, when the Field is added using this fixed version of the <Field/> element the Content Type Subscription timer job completes successfully!

Querying for Feature Upgrades error: The site with id cannot be found


Introduction

I am involved in a large project which is creating a large number of SharePoint webs. The webs content and configuration are being modified using Features and Feature Upgrades.

We are using PowerShell to process the Feature Upgrades using Chris O’Brien’s excellent SharePoint Feature Upgrade Kit.

One of the issues that we started to see during testing was when looking for Features which are scoped at the Site Collection using the SPWebApplication object’s QueryFeatures(SPFeatureScope, Boolean) function.

The following PowerShell was being used:-

$webapp = Get-SPWebApplication http://dev.itsp.local;
$webapp.QueryFeatures("Site",$true);

When this code was run in SharePoint 2010 Management Console the following error was displayed.

An error occurred while enumerating through a collection:
The site with the id f6f2e2bb-46bf-4c46-995e-65055512114e could not be found..
At line:1 char:22 + $webapp.QueryFeatures &amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;amp;lt; (&amp;quot;Site&amp;quot;,$true); + CategoryInfo
: InvalidOperation: (Microsoft.Share...esultCollection:SPFeatureQueryResultCollection) [],
RuntimeException + FullyQualifiedErrorId : BadEnumeration

Investigation

Investigation started by looking at whether this error could be reproduced on other SharePoint environments which it could. Further testing was performed using different SharePoint builds including SharePoint 2010 Service Pack 1 and Cumulative Updates from June 2011 to December 2011.

The cause of the error seems to be when you have a site collection that has been deleted from SharePoint but had a feature that needs to be upgraded.

Looking in the Content Database for the Web Application revealed a entry in the AllSites table which looked like this:-

contentdb_deletedsiteentry

Reminder: Accessing the SharePoint databases is not supported by Microsoft and should not be performed in a production environment.

The row in the database has a column called Deleted which has a status of 1.

Using the Get-SPSite cmdlet the Site Collection could not be found. However, a colleague reminded me that there is a Get-SPDeletedSite. This returns back site collections that are found in the site collection recycle bin. The command returned a site collections that had been deleted a few weeks ago.

There is a function, Remove-SPDeletedSite but while this removes the site collection so it cannot be accessed via Get-SPDeletedSite, the error still occurs and the record is still found in the Content Database.

The issue seems to be down to the way that the SPWebApplication.QueryFeatures function works and does not filter the site collections which have been deleted and hence the error occurs.

Solution

Currently there is no fix for this issue that I am aware of. However, all is not lost and a workaround was possible by a few additional lines of PowerShell.

$webapp = Get-SPWebApplication http://dev.itsp.local;
$webapp.Sites | ForEach-Object {$queryFeatureResults += $_.QueryFeatures("Site",$true)};

This PowerShell command will enumerate through all the SPSite in the Web Application and call the same function but on each Site Collection. This gets around the problem with the QueryFeature() function finding the deleted site collection.

queryfeature-foreach-withresult