我需要创建符合复杂 XSD 文件的 XML 文件。我的方法是逐步(使用 TDD)验证 XSD 上的每种类型。我只能验证根元素,所以我正在做的是
- 在同一命名空间上创建一个新模式,其中只有一个名为“TestNode”的目标复杂类型的根元素进行测试
- 将架构添加到架构验证列表
所以,这是原始复杂模式的一部分
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xs:schema xmlns="urn:FooSchema" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="urn:FooSchema">
<xs:element name="Document" type="Document"/>
<xs:complexType name="AComplexType">
<xs:sequence>
<xs:element name="MsgId" type="Max35Text"/>
...
</xs:complexType>
...
...
<xs:element name="OriginalElement" type="AComplexType"/>
...
...
</xs:schema>
我想使用“AComplexTypeFormat”格式创建和验证 XML 节点,但我无法验证“OriginalElement”,因为它不是根元素。
我不允许修改原始 XSD 文件。因此,我的解决方法是创建一个附件 NodeTester XSD 文件:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element xmlns="urn:FooSchema" name="TestNode" type="AComplexType" />
</xs:schema>
然后将 BOTH 模式添加到验证列表中
XmlSchema originalSchema = XmlSchema.Read(new StreamReader("ComplexSchema.xsd"), XMLValidationEventHandler);
XmlSchema testingSchema = XmlSchema.Read(new StreamReader("NodeTester.xsd"), XMLValidationEventHandler);
XmlReaderSettings validatorSettings = new XmlReaderSettings();
validatorSettings.Schemas.Add(originalSchema);
validatorSettings.Schemas.Add(testingSchema);
validatorSettings.ValidationType = ValidationType.Schema;
validatorSettings.ConformanceLevel = ConformanceLevel.Fragment;
validatorSettings.ValidationEventHandler += new ValidationEventHandler(XMLValidationEventHandler);
XmlReader validationReader = XmlReader.Create(new StringReader(stringXML), validatorSettings);
while (validationReader.Read()) { }
当我验证包含 XML 节点的 stringXML 时,我收到一个错误(抱歉,从西班牙语翻译):
The element 'TestNode' has a secondary element 'MsgId' not valid. Expected list of possible elements: 'MsgId' in the namespace 'urn:FooSchema'.
神秘的 :( 'MsgID' 是不允许的,因为验证器正在等待...'MsgID'
怎么了?这是正确的(将另一个方案添加到列表中),还是有另一种方法可以合并来自不同文件的同一命名空间的元素以进行验证?
谢谢!