【发布时间】:2011-02-17 21:51:36
【问题描述】:
我正在处理一个标记必须具有一组属性或另一组属性的 XML 文档。例如,它需要看起来像 <tag foo="hello" bar="kitty" /> 或 <tag spam="goodbye" eggs="world" />,例如
<root>
<tag foo="hello" bar="kitty" />
<tag spam="goodbye" eggs="world" />
</root>
所以我有一个 XSD 架构,我使用 xs:choice 元素在两个不同的属性组之间进行选择:
<xsi:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema" attributeFormDefault="unqualified" elementFormDefault="qualified">
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" name="tag">
<xs:choice>
<xs:complexType>
<xs:attribute name="foo" type="xs:string" use="required" />
<xs:attribute name="bar" type="xs:string" use="required" />
</xs:complexType>
<xs:complexType>
<xs:attribute name="spam" type="xs:string" use="required" />
<xs:attribute name="eggs" type="xs:string" use="required" />
</xs:complexType>
</xs:choice>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xsi:schema>
但是,当使用 lxml 尝试加载此架构时,我收到以下错误:
>>> from lxml import etree
>>> etree.XMLSchema( etree.parse("schema_choice.xsd") )
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "xmlschema.pxi", line 85, in lxml.etree.XMLSchema.__init__ (src/lxml/lxml.etree.c:118685)
lxml.etree.XMLSchemaParseError: Element '{http://www.w3.org/2001/XMLSchema}element': The content is not valid. Expected is (annotation?, ((simpleType | complexType)?, (unique | key | keyref)*))., line 7
由于错误在于我的 xs:choice 元素的放置,我尝试将它放在不同的位置,但无论我尝试什么,我似乎都无法使用它来定义一个标签来拥有其中一个一组属性(foo 和 bar)或另一个(spam 和 eggs)。
这甚至可能吗?如果是这样,那么正确的语法是什么?
【问题讨论】:
标签: python xml validation schema lxml