Как найти элемент XML по значению атрибута, используя ElementTree
Попытка разобрать 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 ответ
Я не знаю, как это сделать с {None: "urn:oasis:names:tc:xliff:document:1.2"}
пространство имен root.nsmap
...
Однако, если вы переопределите карту пространства имен, как
ns = {"n": "urn:oasis:names:tc:xliff:document:1.2"}
тогда это работает
root.find('.//n:trans-unit[@id="111"]', ns)