0

我需要创建符合复杂 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'

怎么了?这是正确的(将另一个方案添加到列表中),还是有另一种方法可以合并来自不同文件的同一命名空间的元素以进行验证?

谢谢!

4

1 回答 1

0

最后,我找到了另一种解决方法:不添加新模式,而是编辑方案

因此,如果我需要测试 XML 片段(节点)是否与特定 XSD 类型兼容,我只需编辑模式并添加要测试的类型的 ROOT 元素,并使用 XML 片段根元素的名称。

public static void AddElementToSchema(XmlSchema xmlSchema, string elementName, string elementType, string xmlNamespace)
{
    XmlSchemaElement testNode = new XmlSchemaElement();
    testNode.Name = elementName;
    testNode.Namespaces.Add("", xmlNamespace);
    testNode.SchemaTypeName = new XmlQualifiedName(elementType, xmlNamespace);
    xmlSchema.Items.Add(testNode);
    xmlSchema.Compile(XMLValidationEventHandler);
}

在我在内存中编译的新模式中,该元素现在是根,我可以正确验证它:)

于 2013-10-10T18:17:43.390 回答