使用未知元素扩展XML

使用未知元素扩展XML,xml,xsd,Xml,Xsd,假设我有一个XML模式,并希望在多个节点上支持一些扩展。扩展应该是这些节点中的有效XML 我知道这可能是通过模式中的元素实现的。但是,在使用模式的XML中,我希望此扩展只使用来自其他XSD的节点。因此,在运行时指定扩展的模式,然后能够根据扩展模式验证此扩展 以下示例使用静态扩展架构: <xs:element name="notes" minOccurs="0"> <xs:complexType> <xs:sequence> <xs:any nam

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

我知道这可能是通过模式中的元素实现的。但是,在使用模式的XML中,我希望此扩展只使用来自其他XSD的节点。因此,在运行时指定扩展的模式,然后能够根据扩展模式验证此扩展

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


<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>

你好,世界!
现在我确实想要一个解析器错误,因为使用“严格”处理来强制任何元素的内容根据其模式进行验证,即

<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元素上的SturalOcChina属性(尽管它们应该,每个规格)。 将schemaLocation属性移动到根元素中可能(也可能不) 改进:若验证器抱怨html元素,那个么它就坏了。

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

<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元素上的SturalOcChina属性(尽管它们应该,每个规格)。 将schemaLocation属性移动到根元素中可能(也可能不)


改进:如果验证器抱怨html元素,它就坏了。

谢谢Martin。也许我的问题不够清楚(或者我不明白答案)。我的意思是,我不知道我的“主”模式中的扩展模式,所以我不能像第一个片段那样静态地定义该模式。请参阅我在开始主题中添加的内容。再次感谢!杰出的是的,我现在知道怎么了。非常感谢你的帮助。谢谢马丁。也许我的问题不够清楚(或者我不明白答案)。我的意思是,我不知道我的“主”模式中的扩展模式,所以我不能像第一个片段那样静态地定义该模式。请参阅我在开始主题中添加的内容。再次感谢!杰出的是的,我现在知道怎么了。非常感谢你的帮助。我看不出有错!XMLSpy可能很愚蠢,不切换名称空间。然而。。。body2在这一点上是无效元素!如果你拿了尸体怎么办?看我的编辑。XMLSpy拒绝html元素是正确的:您没有指定从何处获取该元素的架构。我看不出有错误!XMLSpy可能很愚蠢,不切换名称空间。然而。。。body2在这一点上是无效元素!如果你拿了尸体怎么办?看我的编辑。XMLSpy拒绝html元素是正确的:您没有指定从何处获取该元素的模式。