使用Python

时间:2019-11-19 11:55:15

标签: python xml

我有以下格式的XSD文件:

<?xml version="1.0" encoding="UTF-8"?><xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:type name="type1">
        <xsd:example>
          <xsd:description>This is the description of said type1 tag</xsd:description>
        </xsd:example>
    </xsd:type>
    <xsd:type name="type2">
        <xsd:example>
          <xsd:description>This is the description of said type2 tag</xsd:description>
        </xsd:example>
    </xsd:type>
    <xsd:type name="type3">
        <xsd:example>
          <xsd:description>This is the description of said type3 tag</xsd:description>
        </xsd:example>
    </xsd:type>
</xsd:schema>

以及以下XML文件:

<theRoot>
    <type1>hi from type1</type1>
    <theChild>
        <type2>hi from type2</type2>
        <type3>hi from type3</type3>
    </theChild>
</theRoot>

我想检索xsd:description标记之间的值,因为它是具有name =“ type1”属性的xsd:type标记的子代。换句话说,我想检索“这是所述type1标签的描述”。

我尝试通过以下方式使用Python使用lxml来做到这一点:

from lxml import etree
XSDDoc = etree.parse(xsdFile)
root = XSDDoc.getroot()
result = root.findall(".//xsd:type/xsd:example/xsd:description[@name='type1']", root.nsmap)

我使用了与here相同的示例和解决方案。但是,我所做的只是返回空结果,而我无法检索正确的结果。

作为参考,我的Python版本是:Python 2.7.10

编辑: 当我通过从字符串中检索XML结构使用答案中提供的示例时,结果如预期的那样。但是,当我尝试从文件中检索时,会得到返回的空列表(或无)。

我正在执行以下操作:

  • 从文件中检索XML
  • 包含一个用于表示名称属性的变量(因为它是动态的)

代码在单独的XML文件中循环每个节点,然后检入XSD文件以获取每个属性,作为结果:

XMLDoc = etree.parse(open(xmlFile))

for Node in XMLDoc.xpath('//*'):
    nameVariable = os.path.basename(XMLDoc.getpath(Node))
    root = XSDDoc.getroot()
    description = XSDDoc.find(".//xsd:type[@name='{0}']/xsd:example/xsd:description".format(nameVariable), root.nsmap)

如果我尝试打印出result.text,则会得到:

  

AttributeError:'NoneType'对象没有属性'text'

1 个答案:

答案 0 :(得分:1)

谓词(<resources> <string name="app_name">Localization</string> <string name="action_settings">Settings</string> <string name="test_string">Ukrainian</string> </resources> )必须在正确的位置使用。 [@name='type1']属性位于name元素上。这应该起作用:

xsd:type

如果只需要一个节点,则可以使用result = root.findall(".//xsd:type[@name='type1']/xsd:example/xsd:description", root.nsmap) # result is a list for r in result: print(r.text) 代替find。完整示例:

findall