XML 使用 XSD 的验证失败,而在线验证器通过
XML validation with XSD fails while online validators pass
我有一个简单的 XML 文件,我想根据 XSD 对其进行验证。但是,每当我 运行 我的验证代码时,我都会收到一个验证异常,指出 "multitest" 节点未定义(未本地化的错误消息:"The multitest element is not declared.")。奇怪的是,我试图在几个在线验证站点 (http://www.xmlvalidation.com, http://www.freeformatter.com/xml-validator-xsd.html) 上针对 XSD 验证 XML,他们说 XML 完全有效。
这是我用来验证的代码(C# 和 Mono 库)
// 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>
我认为这是关闭的,因为它本质上是一个拼写错误,而不是实际问题。
为了完整起见,我要指出您正在验证错误的架构。读取架构字符串的第一行是:
using (StringReader sr = new StringReader (Resources.tests))
并且 Resources.tests
听起来像是指的是您问题中的第二个模式(并且您已经确认了这一点)。只需将其更改为正确的架构即可解决您的问题。
我有一个简单的 XML 文件,我想根据 XSD 对其进行验证。但是,每当我 运行 我的验证代码时,我都会收到一个验证异常,指出 "multitest" 节点未定义(未本地化的错误消息:"The multitest element is not declared.")。奇怪的是,我试图在几个在线验证站点 (http://www.xmlvalidation.com, http://www.freeformatter.com/xml-validator-xsd.html) 上针对 XSD 验证 XML,他们说 XML 完全有效。
这是我用来验证的代码(C# 和 Mono 库)
// 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>
我认为这是关闭的,因为它本质上是一个拼写错误,而不是实际问题。
为了完整起见,我要指出您正在验证错误的架构。读取架构字符串的第一行是:
using (StringReader sr = new StringReader (Resources.tests))
并且 Resources.tests
听起来像是指的是您问题中的第二个模式(并且您已经确认了这一点)。只需将其更改为正确的架构即可解决您的问题。