使用未知元素扩展XML

时间:2010-12-12 09:10:59

标签: xml xsd

假设我有一个XML架构,并希望在多个节点上支持某些扩展。扩展名应该是这些节点中的有效XML。

我知道这可以通过< any>实现。您架构中的元素。但是在我使用我的架构的XML中,我希望此扩展仅使用来自其他XSD的节点。因此,在运行时指定扩展的Schema,然后能够根据扩展架构验证此扩展。

以下示例使用静态扩展架构:


<xs:element name="notes" minOccurs="0">
  <xs:complexType>
    <xs:sequence>
      <xs:any namespace="http://www.w3.org/1999/xhtml"
           minOccurs="0" maxOccurs="unbounded"
           processContents="skip"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

现在我想在我的XML中指定这个模式,例如(我是一个新手),像这样:


<foo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:noNamespaceSchemaLocation="myschema.xsd">
  <bar>
    <extension>
       <html namespace="http://www.w3.org/1999/xhtml">
         <body>Hello, World!</body>
       </html>
    </extension>
  </bar>
</foo>

最佳方法是什么?理想情况下,我想在我的XML的扩展节点中使用我的XML模型列表。

谢谢!

==编辑,更详细的解释:==

我想支持特定节点中的用户定义的XML数据。在编写“主”模式时,我不知道这些扩展的模式。

我在XSD中指定了以下片段:


<xs:element name="extension">
    <xs:complexType>
        <xs:sequence>
            <xs:any namespace="##other" processContents="strict"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>

并希望使用以下XML:


<foo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="test.xsd" >
    <bar>
        <extension>
            <html xmlns="http://www.w3.org/1999/xhtml">
                <body2>Hello, world!</body2>
            </html>
        </extension>
    </bar>
</foo>

现在我确实想要一个解析器错误,因为&lt; body2不是一个有效的XHTML元素。然而,XMLSpy解析器已经在抱怨&lt; html&gt;无效的元素。

1 个答案:

答案 0 :(得分:0)

使用“严格”处理来强制任何元素的内容根据其模式进行验证,即

<xs:element name="notes" minOccurs="0">
  <xs:complexType>
    <xs:sequence>
      <xs:any namespace="http://www.w3.org/1999/xhtml"
           minOccurs="0" maxOccurs="unbounded"
           processContents="strict"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

然后验证您的文档将失败,因为处理器可能无法获取XHTML的架构。您还需要在实例文档中指定它,如下所示:

<foo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:noNamespaceSchemaLocation="test.xsd">
 <extension>
  <html xmlns="http://www.w3.org/1999/xhtml" 
    xsi:schemaLocation="http://www.w3.org/1999/xhtml 
                        http://www.w3.org/2002/08/xhtml/xhtml1-strict.xsd">
   <body2>Hello, world!</body2>
  </html>
 </extension>
</foo>

现在,许多XSD验证器仍会对此产生阻碍,因为它们不考虑html元素上的schemaLocation属性(尽管它们应该按照规范)。 将schemaLocation属性移动到根元素中可能(或可能不) 改进的方法:如果验证器抱怨html元素,它就会被破坏。