我有一个简单的XML文件,我想针对XSD进行验证。但是,每当我运行验证代码时,我都会收到一个验证异常,说明" multitest"节点未定义(未定位的错误消息:"未声明多重元素。")。奇怪的是,我尝试在几个在线验证网站(http://www.xmlvalidation.com,http://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>
答案 0 :(得分:0)
我会投票这是关闭的,因为它本质上是一个错字而不是实际问题。
为了完整起见,我会指出您正在验证错误的架构。您读取架构字符串的第一行是:
using (StringReader sr = new StringReader (Resources.tests))
并且Resources.tests
听起来像是指你问题中的第二个架构(并且你已经证实了这一点)。只需将其更改为正确的架构,它就可以解决您的问题。