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