c# XML Schema validation
11,668
You need to set default namespace in your xml, like this:
<?xml version="1.0" encoding="utf-8" ?>
<Assets xmlns="http://tempuri.org/data.xsd">
<Asset>
<FileName>Boomerang - Error codes.xlsx</FileName>
<DisplayName>Boomerang - Error codes</DisplayName>
<Description>This is the Boomerang error codes file</Description>
<Tags>
<Tag>Excel</Tag>
<Tag>Boomerang</Tag>
</Tags>
<Categories>
<Category>1</Category>
<Category>4</Category>
</Categories>
</Asset>
<Asset>
<FileName>Issue Tracker v5.xlsx</FileName>
<Description>This is the issue tracker for Skipstone</Description>
<Tags>
<Tag>Excel</Tag>
<Tag>Skipstone</Tag>
</Tags>
<Categories>
<Category>1</Category>
<Category>4</Category>
</Categories>
</Asset>
</Assets>
Also, there is a number of other problems:
Path attribute is not defined in schema, 'Assetd' element is not defined. maxOccurs="unbounded" need to be set in schema for xs:element name="Asset"
In case if you cannot modify xml, you need to remove target schema from xsd:
<xs:schema id="data"
xmlns:mstns="http://tempuri.org/data.xsd"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
And register schema like this:
settings.Schemas.Add(null, "data.xsd");
Comments
-
r3plica almost 2 years
I have a nice XML file like this:
<?xml version="1.0" encoding="utf-8" ?> <Assets Path="C:\Users\r3plica\Google Drive"> <Assetd> <FileName>Boomerang - Error codes.xlsx</FileName> <DisplayName>Boomerang - Error codes</DisplayName> <Description>This is the Boomerang error codes file</Description> <Tags> <Tag>Excel</Tag> <Tag>Boomerang</Tag> </Tags> <Categories> <Category>1</Category> <Category>4</Category> </Categories> </Assetd> <Asset> <FileName>Issue Tracker v5.xlsx</FileName> <Description>This is the issue tracker for Skipstone</Description> <Tags> <Tag>Excel</Tag> <Tag>Skipstone</Tag> </Tags> <Categories> <Category>1</Category> <Category>4</Category> </Categories> </Asset> </Assets>
and then I have my schema which I created like this:
<?xml version="1.0" encoding="utf-8"?> <xs:schema id="data" targetNamespace="http://tempuri.org/data.xsd" elementFormDefault="qualified" xmlns="http://tempuri.org/data.xsd" xmlns:mstns="http://tempuri.org/data.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema" > <xs:element name="Assets"> <xs:complexType> <xs:sequence> <xs:element name="Asset" type="Asset" minOccurs="1" /> </xs:sequence> </xs:complexType> </xs:element> <xs:complexType name="Asset"> <xs:sequence> <xs:element name="FileName" type="xs:string" minOccurs="1" maxOccurs="1" /> <xs:element name="DisplayName" type="xs:string" minOccurs="0" maxOccurs="1" /> <xs:element name="Description" type="xs:string" minOccurs="0" maxOccurs="1" /> <xs:element name="Tags" type="Tags" minOccurs="0" maxOccurs="1" /> <xs:element name="Categories" type="Categories" minOccurs="1" maxOccurs="1" /> </xs:sequence> </xs:complexType> <xs:complexType name="Tags"> <xs:sequence> <xs:element name="Tag" type="xs:string" minOccurs="1" maxOccurs="unbounded" /> </xs:sequence> </xs:complexType> <xs:complexType name="Categories"> <xs:sequence> <xs:element name="Category" type="xs:int" minOccurs="1" maxOccurs="unbounded" /> </xs:sequence> </xs:complexType> </xs:schema>
As far as I can see looking at that, the xml file is invalid because the first element is Assetd and not Asset, but if I run my c# code:
XmlSchemaSet schemas = new XmlSchemaSet(); schemas.Add("http://tempuri.org/data.xsd", "data.xsd"); XDocument doc = XDocument.Load(openFileDialog1.FileName); string msg = ""; doc.Validate(schemas, (o, err) => { msg = err.Message; }); Console.WriteLine(msg == "" ? "Document is valid" : "Document invalid: " + msg);
it tells me the xml is valid... If I use this code:
// Set the validation settings. XmlReaderSettings settings = new XmlReaderSettings(); settings.ValidationType = ValidationType.Schema; settings.Schemas.Add("http://tempuri.org/data.xsd", "data.xsd"); settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessInlineSchema; settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessSchemaLocation; settings.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings; settings.ValidationEventHandler += new ValidationEventHandler(ValidationCallBack); // Create the XmlReader object. XmlReader reader = XmlReader.Create(openFileDialog1.FileName, settings); // Parse the file. while (reader.Read()) ;
I get this output in the console:
Warning: Matching schema not found. No validation occurred. Could not find schema information for the element 'Assets'. Warning: Matching schema not found. No validation occurred. Could not find schema information for the attribute 'Path'. Warning: Matching schema not found. No validation occurred. Could not find schema information for the element 'Assetd'. Warning: Matching schema not found. No validation occurred. Could not find schema information for the element 'FileName'. Warning: Matching schema not found. No validation occurred. Could not find schema information for the element 'DisplayName'. Warning: Matching schema not found. No validation occurred. Could not find schema information for the element 'Description'. Warning: Matching schema not found. No validation occurred. Could not find schema information for the element 'Tags'. Warning: Matching schema not found. No validation occurred. Could not find schema information for the element 'Tag'. Warning: Matching schema not found. No validation occurred. Could not find schema information for the element 'Tag'. Warning: Matching schema not found. No validation occurred. Could not find schema information for the element 'Categories'. Warning: Matching schema not found. No validation occurred. Could not find schema information for the element 'Category'. Warning: Matching schema not found. No validation occurred. Could not find schema information for the element 'Category'. Warning: Matching schema not found. No validation occurred. Could not find schema information for the element 'Asset'. Warning: Matching schema not found. No validation occurred. Could not find schema information for the element 'FileName'. Warning: Matching schema not found. No validation occurred. Could not find schema information for the element 'Description'. Warning: Matching schema not found. No validation occurred. Could not find schema information for the element 'Tags'. Warning: Matching schema not found. No validation occurred. Could not find schema information for the element 'Tag'. Warning: Matching schema not found. No validation occurred. Could not find schema information for the element 'Tag'. Warning: Matching schema not found. No validation occurred. Could not find schema information for the element 'Categories'. Warning: Matching schema not found. No validation occurred. Could not find schema information for the element 'Category'. Warning: Matching schema not found. No validation occurred. Could not find schema information for the element 'Category'.
Can anyone tell me what I am doing wrong please? It is killing me :(
cheers, /r3plica