c# XML Schema validation

c#, validation, xml, xsd

Solution

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");

Problem

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

Original source