繁体   English   中英

使用附件XSD文件针对模式验证XML节点

[英]Validate XML nodes against a schema using accesory XSD files

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

然后将两个模式都添加到验证列表中

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'

怎么了? 这是正确的吗(在列表中添加其他方案),还是有另一种方式来合并来自不同文件的同一名称空间的元素以进行验证?

谢谢!

最后,我找到了另一个解决方法:不添加新架构,而是编辑方案

因此,如果我需要测试XML片段(节点)是否符合特定的XSD类型,则只需编辑架构并添加带有XML片段根元素名称的该类型的ROOT元素进行测试。

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);
}

在新的,在内存中编译的架构中,该元素现在是root,我可以正确地验证它了:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM