在XML模式注释/ appinfo中验证XML内容

时间:2012-04-08 22:29:30

标签: c# xsd

我对XML的理解并不完全令人惊叹,但我对注释/ appinfo中内容的理解是,您可以使用任何格式良好的XML,而且这种格式很难验证。我对松散验证的理解是,如果可以获得相关的模式信息,将验证元素和属性。

我的情况是我有一个XML模式,其中包含本节中需要验证的一些内容。我有相关的模式来验证内容。

我采用了一个非常简单的XML架构,并为其添加了一个appinfo元素,如下所示。 appinfo的内容是另一个元素声明,纯粹是为了简单起见,不引用另一个模式。我试图验证的模式显然引用了不同的模式。

<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
        targetNamespace="http://www.demo.org"
        xmlns="http://www.demo.org"
        elementFormDefault="qualified">
<xsd:annotation>
    <xsd:appinfo>
        <xsd:element name="Demo">
            <xsd:complexType>
                <xsd:sequence>
                    <xsd:element name="A" type="xsd:iteger"/>
                    <xsd:element name="B" type="xsd:integer"/>
                </xsd:sequence>
            </xsd:complexType>
        </xsd:element>    
    </xsd:appinfo>
</xsd:annotation>
<xsd:element name="Demo">
    <xsd:complexType>
        <xsd:sequence>
            <xsd:element name="A" type="xsd:integer"/>
            <xsd:element name="B" type="xsd:integer"/>
        </xsd:sequence>
    </xsd:complexType>
</xsd:element>

请注意,在appinfo部分,我故意在元素A上错误拼写“整数”。如果我在架构的主体中执行此操作,那么XmlSchemaSet.Compile()将告诉我此架构无效。

但是,如果我按照上面的描述使用模式,它会告诉我没有问题。在我开始使用的更复杂的文件中,我通过XmlSchemaSet.Add()

将外部模式提供给XmlSchemaSet。

我还尝试从http://www.w3.org/2001/XMLSchema.xsd加载XML架构,并将要验证的架构加载到XmlDocument并运行XmlDocument.Validate(),但没有乐趣。

在我花了几个小时之后,我觉得我完全错过了一些完全基本的东西。任何指针赞赏!

1 个答案:

答案 0 :(得分:0)

这不是我对lax的理解:如果你有声明

<any
  namespace=". . . " 
  processContents="lax">
</any>

将验证正在验证的XML中相应元素的内容,以针对与namespace指定的命名空间(如果有)对应的模式进行验证 - 而不是针对它可能使用的任何模式。 appInfo的声明是

<xs:element name="appinfo" id="appinfo">
  <xs:complexType mixed="true">
    <xs:sequence minOccurs="0" maxOccurs="unbounded">
      <xs:any processContents="lax"/>
    </xs:sequence> 
    <xs:attribute name="source" type="xs:anyURI"/> 
    <xs:anyAttribute namespace="##other" processContents="lax"/> 
  </xs:complexType> 
 </xs:element>

没有任何namespace规范,对应namespace="##any",这意味着没有针对任何架构的验证。