如何使用ElementTree通过属性值查找xml元素

时间:2018-11-24 03:24:23

标签: python xml xliff

尝试使用名称空间和属性解析XML。我希望通过给定属性(id)来检索元素。

文档中指定但

  

[@ attrib]选择具有给定属性的所有元素。

     

[@ attrib ='value']选择给定属性具有给定值的所有元素。该值不能包含引号。

以下两种解决方案都不会在给定属性名称和值或仅给定属性名称时返回元素

from lxml import etree
tree = etree.parse("es.xml")
root = tree.getroot()

print root.findall('file/body/trans-unit', root.nsmap)


# Unable to fetch all with attribute == id
print root.findall('file/body/trans-unit[@id]', root.nsmap)

# Unable to fetch element with id = 111
print root.find('file/body/trans-unit[@id="111"]', root.nsmap)

XML

<?xml version="1.0" encoding="UTF-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2">
<file original="PDDDD" source-language="en" datatype="plaintext" target-language="es">
<header>
<tool tool-id="com.apple.dt.xcode" tool-name="Xcode" tool-version="10.1" build-num="10B61"/>
</header>
<body>
<trans-unit id="111">
<source>Welcome!</source>
<target>Welcome!</target>
<note>Class = "UILabel"; text = "Welcome!"; ObjectID = "7oz-Od-KDt";</note>
</trans-unit>
</body>
</file>
</xliff>

1 个答案:

答案 0 :(得分:0)

我不知道如何使用{None: "urn:oasis:names:tc:xliff:document:1.2"}的{​​{1}}名称空间...

但是,如果您重新定义名称空间映射,例如

root.nsmap

然后这有效

ns = {"n": "urn:oasis:names:tc:xliff:document:1.2"}