我正在尝试使用lxml 2.x获取具有特定xsd类型的元素列表,但我无法弄清楚如何遍历特定类型的xsd。
架构示例:
<xsd:element name="ServerOwner" type="srvrs:string90" minOccurs="0">
<xsd:element name="HostName" type="srvrs:string35" minOccurs="0">
示例xml数据:
<srvrs:ServerOwner>John Doe</srvrs:ServerOwner>
<srvrs:HostName>box01.example.com</srvrs:HostName>
理想的功能如下:
elements = getElems(xml_doc, 'string90')
def getElems(xml_doc, xsd_type):
** xpath or something to find the elements and build a dict
return elements
答案 0 :(得分:5)
Lxml对XML Schema的唯一特殊支持,如here所示,是告诉您某些文档是否根据某种模式有效。任何更复杂的事情,你都必须自己做。
这应该是一个相对简单的两阶段过程,我认为 - 获取模式中与您关注的类型匹配的所有xsd:element
元素,并查看它们的名称:
def getElems(schemaDoc, xmlDoc, typeName):
names = schemaDoc.xpath("//xsd:element[@type = $n]/@name",
namespaces={"xsd":
"http://www.w3.org/2001/XMLSchema"},
n=typeName)
然后,从文档中获取每个名称的所有元素。
elements = []
for name in names:
namedElements = xmlDoc.xpath("//*[local-name() = $name]", name=name)
elements.extend(namedElements)
现在您有一个元素列表,其名称与架构中的类型相匹配。
return elements
请注意,搜索文档的xpath表达式必须查看每个元素,因此如果您可以将其加强以仅查看您关心的文档的子部分,那么它会更快。