解析XSD文件不起作用 - >找不到任何标签

时间:2014-06-13 17:12:36

标签: python parsing xsd

我目前正在尝试使用lxml库在python中解析XSD文件。 出于测试目的,我将以下文件一起复制:

<xs:schema targetNamespace="http://www.w3schools.com" elementFormDefault="qualified">  
  <xs:element name="note">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="to" type="xs:string"/>
        <xs:element name="from" type="xs:string"/>
        <xs:element name="heading" type="xs:string"/>
        <xs:element name="body" type="xs:string"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
<xs:simpleType name="BaselineShiftValueType">
  <xs:annotation>
    <xs:documentation>The actual definition is
            baseline | sub | super | <percentage> | <length> | inherit 
            not sure that union can do this 
    </xs:documentation>
  </xs:annotation>
  <xs:restriction base="string"/>
 </xs:simpleType>
</xs:schema>

现在我试图获取root(schema)的子代,它们是:xs:element和xs:simpleType。 通过迭代根的子节点,一切正常:

root = self.XMLTree.getroot()
for child in root:
    print("{}: {}".format(child.tag, child.attrib))

这导致输出:

{http://www.w3.org/2001/XMLSchema}element: {'name': 'note'}
{http://www.w3.org/2001/XMLSchema}simpleType: {'name': 'BaselineShiftValueType'}

但是当我想要只有某种类型的孩子时,它不起作用:

root = self.XMLTree.getroot()
element = self.XMLTree.find("element")
print(str(element))

这给了我以下输出:

None

同时使用findall或编写./element.//element不会更改结果。 我很确定我错过了一些东西。这样做的正确方法是什么?

2 个答案:

答案 0 :(得分:1)

您缺少名称空间。未加前缀的XPath选择器被视为不属于任何名称空间。您必须使用register_namespace注册:

self.XMLTree.register_namespace('xs',"http://www.w3.org/2001/XMLSchema")

然后使用前缀选择器来查找元素:

element = self.XMLTree.find("xs:element")

答案 1 :(得分:0)

要关注@helderdarocha's answer,您还可以在字典中定义命名空间,并在搜索功能中使用它,例如python xml.etree.ElementTree doc

ns = {'xs',"http://www.w3.org/2001/XMLSchema"}
element = self.XMLTree.find("element", ns)