假设我有一个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;无效的元素。
答案 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元素,它就会被破坏。