在线验证器通过时,XSD的XML验证失败

时间:2015-06-05 22:27:27

标签: c# xml mono xsd-validation

我有一个简单的XML文件,我想针对XSD进行验证。但是,每当我运行验证代码时,我都会收到一个验证异常,说明" multitest"节点未定义(未定位的错误消息:"未声明多重元素。")。奇怪的是,我尝试在几个在线验证网站(http://www.xmlvalidation.comhttp://www.freeformatter.com/xml-validator-xsd.html)上针对XSD验证XML,他们说XML完全有效。

这是我用来验证的代码(带有Mono库的C#)

// Resources.tests contains the XSD file in string format, xmlFileName points to the XML file location
using (StringReader sr = new StringReader (Resources.tests)) {
    XmlReader r = XmlReader.Create (sr);
    XmlReaderSettings settings = new XmlReaderSettings ();
    settings.Schemas.Add (null, r);
    settings.ValidationType = ValidationType.Schema;
    using (FileStream fs = new FileStream (xmlFileName, FileMode.Open)) {
        var reader = XmlReader.Create (fs, settings);
        while (reader.Read ()) {
            // Nothing in here, just need to read out the entire file in a loop.
        }
    }
}

这是我尝试验证的XML文件:

<?xml version="1.0" encoding="UTF-8"?>
<multitest>
    <testfile>
        <location>blah.xml</location>
    </testfile>
</multitest>

XSD也非常简单:

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="multitest">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="testfile" maxOccurs="unbounded" minOccurs="1">
          <xs:complexType>
            <xs:sequence>
              <xs:element type="xs:string" name="location"/>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

我错过了什么?

增加:

奇怪的是,相同的代码完全适用于下面给出的XML和XSD:

XSD:

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="tests">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="test" maxOccurs="unbounded" minOccurs="1">
          <xs:complexType>
            <xs:sequence>
              <xs:element type="xs:string" name="sample"/>
              <xs:element type="xs:string" name="cmd"/>
              <xs:element type="xs:string" name="result"/>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

XML:

<?xml version="1.0" encoding="UTF-8"?>
<tests>
  <test>
    <sample>blahblah.txt</sample>
    <cmd>samplecmd</cmd>
    <result>blahblahblah_result.txt</result>
  </test>
</tests>

1 个答案:

答案 0 :(得分:0)

我会投票这是关闭的,因为它本质上是一个错字而不是实际问题。

为了完整起见,我会指出您正在验证错误的架构。您读取架构字符串的第一行是:

using (StringReader sr = new StringReader (Resources.tests))

并且Resources.tests听起来像是指你问题中的第二个架构(并且你已经证实了这一点)。只需将其更改为正确的架构,它就可以解决您的问题。