在Python中解析.xsd
我需要在Python中解析一个.xsd文件,就像解析XML文件一样。
我正在使用libxml2库。
我需要解析的xsd文件大致长这样:
<xs:complexType name="ClassType">
<xs:sequence>
<xs:element name="IeplcHeader">
<xs:complexType>
<xs:sequence>
<xs:element name="device-number" type="xs:integer" fixed="1"/>
</xs:sequence>
<xs:attribute name="version" type="xs:integer" use="required" fixed="0"/>
</xs:complexType>
</xs:element>
当我用下面的方式访问时
doc.xpathEval('//xs:complexType/xs:sequence/xs:element[@name="IeplcHeader"]'):
它告诉我找不到路径。
但是如果我把所有的xs:去掉,像这样
<complexType name="ClassType">
<sequence>
<element name="IeplcHeader">
<complexType>
<sequence>
<element name="device-number" type="xs:integer" fixed="1"/>
</sequence>
<attribute name="version" type="xs:integer" use="required" fixed="0"/>
</complexType>
</element>
这样就可以正常工作了
doc.xpathEval('//complexType/sequence/element[@name="IeplcHeader"]'):
有没有人知道我该如何解决这个问题,固定一个前缀?现在我是在预处理文件,去掉xs:,但这真是个糟糕的解决办法,我真的希望能找到更好的方法。
(我还没有尝试过py-dom-xpath,不知道它是否也能处理xs:)
谢谢,
ste
1 个回答
9
如果你需要处理xsd文件,可能还要用它们来验证xml文件,我建议你使用lxml这个库,它对XMLSchema文件的支持很好。
下面是一个示例代码:
from lxml import etree
from cStringIO import StringIO
f = StringIO()
f = StringIO('''\
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="a" type="AType"/>
<xsd:complexType name="AType">
<xsd:sequence>
<xsd:element name="b" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
''')
xmlschema_doc = etree.parse(f)
xmlschema_doc.xpath('xsd:element',
namespaces={"xsd": "http://www.w3.org/2001/XMLSchema"})
运行结果是:
[<Element {http://www.w3.org/2001/XMLSchema}element at 0x9a17f2c>]