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");
Share:
11,668
r3plica
Author by

r3plica

SOreadytohelp

Updated on June 20, 2022

Comments

  • r3plica
    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