使用辅助 XSD 文件根据架构验证 XML 节点

本文关键字:验证 XML 节点 XSD 文件 | 更新日期: 2023-09-27 18:34:51

>我需要创建符合复杂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 文件。因此,我的解决方法是创建一个辅助节点测试器 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>

然后将两个架构添加到验证列表

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 节点的字符串XML时,我收到一个错误(抱歉,从西班牙语翻译(:

The element 'TestNode' has a secondary element 'MsgId' not valid. Expected list of possible elements: 'MsgId' in the namespace 'urn:FooSchema'.

神秘:(不允许使用"MsgID",因为验证器正在等待..."消息识别码">

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

谢谢!

使用辅助 XSD 文件根据架构验证 XML 节点

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

因此,如果我需要测试 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);
}

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