XML XSD 递归和命名空间
XML XSD recursion and namespaces
我正在努力思考 XSD 中的名称空间和递归,但我感到迷茫。
Error: The QName value 'topic' does not resolve to a(n) element declaration
最重要的部分用白线划分,只是学习xsd,但我的一项作业需要它,所以请放轻松...
代码(我试着按照这个 link: Recursive element in XML ,不幸的是没有结果):
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name='xmap-content'>
<xs:complexType>
<xs:sequence>
<xs:element name='sheet'>
<xs:complexType>
<xs:sequence>
<xs:element name='topic'>
<xs:complexType>
<xs:sequence minOccurs="0" maxOccurs="unbounded">
<xs:element name='title' type='xs:string'/>
<xs:element name='children' minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:sequence>
<xs:element name='topics'>
<xs:complexType>
<xs:sequence>
<xs:element ref='topic' minOccurs="0"
maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
最重要的部分用白线划分,只是学习xsd但我的一项作业需要它,所以请放轻松...
XSD 对元素的递归引用(没有名称空间)
为了递归引用topic
,必须全局定义。您的尝试失败了,因为 topic
是在本地定义的。
这会起作用:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name='xmap-content'>
<xs:complexType>
<xs:sequence>
<xs:element name='sheet'>
<xs:complexType>
<xs:sequence>
<xs:element ref='topic' minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name='topic'>
<xs:complexType>
<xs:sequence minOccurs="0" maxOccurs="unbounded">
<xs:element name='title' type='xs:string'/>
<xs:element name='children' minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:sequence>
<xs:element name='topics'>
<xs:complexType>
<xs:sequence>
<xs:element ref='topic' minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
XSD 对元素的递归引用(带有命名空间)
您在问题中提到了名称空间,但您包含的 XSD 并未尝试定义名称空间。 (如上所示,您的问题本身也与名称空间无关。)但是,上面的 XSD 适合与名称空间一起使用,以防您确实需要它们。请注意,您必须定义命名空间前缀以引用 xs:schema/targetNamespace
:
给出的命名空间中的 topic
元素
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:e="http://www.example.com"
targetNamespace="http://www.example.com">
<xs:element name='xmap-content'>
<xs:complexType>
<xs:sequence>
<xs:element name='sheet'>
<xs:complexType>
<xs:sequence>
<xs:element ref='e:topic' minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name='topic'>
<xs:complexType>
<xs:sequence minOccurs="0" maxOccurs="unbounded">
<xs:element name='title' type='xs:string'/>
<xs:element name='children' minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:sequence>
<xs:element name='topics'>
<xs:complexType>
<xs:sequence>
<xs:element ref='e:topic' minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
我正在努力思考 XSD 中的名称空间和递归,但我感到迷茫。
Error: The QName value 'topic' does not resolve to a(n) element declaration
最重要的部分用白线划分,只是学习xsd,但我的一项作业需要它,所以请放轻松...
代码(我试着按照这个 link: Recursive element in XML ,不幸的是没有结果):
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name='xmap-content'>
<xs:complexType>
<xs:sequence>
<xs:element name='sheet'>
<xs:complexType>
<xs:sequence>
<xs:element name='topic'>
<xs:complexType>
<xs:sequence minOccurs="0" maxOccurs="unbounded">
<xs:element name='title' type='xs:string'/>
<xs:element name='children' minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:sequence>
<xs:element name='topics'>
<xs:complexType>
<xs:sequence>
<xs:element ref='topic' minOccurs="0"
maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
最重要的部分用白线划分,只是学习xsd但我的一项作业需要它,所以请放轻松...
XSD 对元素的递归引用(没有名称空间)
为了递归引用topic
,必须全局定义。您的尝试失败了,因为 topic
是在本地定义的。
这会起作用:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name='xmap-content'>
<xs:complexType>
<xs:sequence>
<xs:element name='sheet'>
<xs:complexType>
<xs:sequence>
<xs:element ref='topic' minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name='topic'>
<xs:complexType>
<xs:sequence minOccurs="0" maxOccurs="unbounded">
<xs:element name='title' type='xs:string'/>
<xs:element name='children' minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:sequence>
<xs:element name='topics'>
<xs:complexType>
<xs:sequence>
<xs:element ref='topic' minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
XSD 对元素的递归引用(带有命名空间)
您在问题中提到了名称空间,但您包含的 XSD 并未尝试定义名称空间。 (如上所示,您的问题本身也与名称空间无关。)但是,上面的 XSD 适合与名称空间一起使用,以防您确实需要它们。请注意,您必须定义命名空间前缀以引用 xs:schema/targetNamespace
:
topic
元素
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:e="http://www.example.com"
targetNamespace="http://www.example.com">
<xs:element name='xmap-content'>
<xs:complexType>
<xs:sequence>
<xs:element name='sheet'>
<xs:complexType>
<xs:sequence>
<xs:element ref='e:topic' minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name='topic'>
<xs:complexType>
<xs:sequence minOccurs="0" maxOccurs="unbounded">
<xs:element name='title' type='xs:string'/>
<xs:element name='children' minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:sequence>
<xs:element name='topics'>
<xs:complexType>
<xs:sequence>
<xs:element ref='e:topic' minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>