Как проверить XML против схемы (XSD)? Что-то не так - PullRequest
2 голосов
/ 05 августа 2010

Я недостаточно знаю пространство имен XML, чтобы увидеть мою ошибку. А ты?

    public static bool ValidateXml(string xml, string xsd)
    {
        try
        {
            // build XSD schema

            StringReader _XsdStream;
            _XsdStream = new StringReader(xsd);

            XmlSchema _XmlSchema;
            _XmlSchema = XmlSchema.Read(_XsdStream, null);

            // build settings (this replaces XmlValidatingReader)

            XmlReaderSettings _XmlReaderSettings;
            _XmlReaderSettings = new XmlReaderSettings()
            {
                ValidationType = ValidationType.Schema
            };
            _XmlReaderSettings.Schemas.Add(_XmlSchema);

            // build XML reader

            StringReader _XmlStream;
            _XmlStream = new StringReader(xml);

            XmlReader _XmlReader;
            _XmlReader = XmlReader.Create(_XmlStream, _XmlReaderSettings);

            // validate

            using (_XmlReader)
            {
                while (_XmlReader.Read())
                    ;
            }

            // validation succeeded

            return true;
        }
        catch
        {
            // validation failed

            return false;
        }
    }

Вот XSD

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://server.com/www/content" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="ads">
  <xs:complexType>
    <xs:sequence>
      <xs:element maxOccurs="unbounded" name="ad">
        <xs:complexType>
          <xs:attribute name="id" type="xs:string" use="required" />
          <xs:attribute name="date" type="xs:string" use="required" />
          <xs:attribute name="checksum" type="xs:string" use="required" />
          <xs:attribute name="size" type="xs:string" use="required" />
          <xs:attribute name="expanded-size" type="xs:string" use="required" />
        </xs:complexType>
      </xs:element>
    </xs:sequence>
    <xs:attribute name="last-modified" type="xs:string" use="required" />
  </xs:complexType>
</xs:element>
</xs:schema>

Вот XML

<?xml version="1.0" encoding="UTF-8" ?>
<ads xmlns="http://server.com/www/content" last-modified="">
    <ad id="ad1" date="" checksum="" size="" expanded-size=""/>
    <ad id="ad2" date="" checksum="" size="" expanded-size=""/>
    <ad id="ad3" date="" checksum="" size="" expanded-size=""/>
</ads>

Метод должен возвращать false, но он возвращает true.

Честно говоря, я не уверен, с чего начать это отлаживать. : S

Заранее благодарим за ваше время и за ответ.

1 Ответ

0 голосов
/ 05 августа 2010

Замените XMLReader на XmlValidatingReader для проверки.Смотри: http://msdn.microsoft.com/en-us/library/system.xml.xmlvalidatingreader_members%28v=VS.71%29.aspx

...