假设您有一个lmxl.etree元素,其内容如:
<root>
<element1>
<subelement1>blabla</subelement1>
</element1>
<element2>
<subelement2>blibli</sublement2>
</element2>
</root>
我可以使用find或xpath方法来获取元素呈现的内容:
<element1>
<subelement1>blabla</subelement1>
</element1>
简单是否有办法获得:
<root>
<element1>
<subelement1>blabla</subelement1>
</element1>
</root>
即感兴趣的元素加上文档根目录下的所有它的祖先?
答案 0 :(得分:2)
我不确定它内置了什么东西,但这里有一个可怕的,“不要在现实生活中使用它”类型的变通方法使用iterancestors()
parent iterator:
from lxml import etree as ET
data = """<root>
<element1>
<subelement1>blabla</subelement1>
</element1>
<element2>
<subelement2>blibli</subelement2>
</element2>
</root>"""
root = ET.fromstring(data)
element = root.find(".//subelement1")
result = ET.tostring(element)
for node in element.iterancestors():
result = "<{name}>{text}</{name}>".format(name=node.tag, text=result)
print(ET.tostring(ET.fromstring(result), pretty_print=True))
打印:
<root>
<element1>
<subelement1>blabla</subelement1>
</element1>
</root>
答案 1 :(得分:1)
以下代码删除了没有List<string> result2 = persons.SelectMany(p => new[] {p.Name, p.Job}).ToList();
个后代且未命名为subelement1
的元素。
subelement1
输出:
from lxml import etree
tree = etree.parse("input.xml") # First XML document in question
for elem in tree.iter():
if elem.xpath("not(.//subelement1)") and not(elem.tag == "subelement1"):
if elem.getparent() is not None:
elem.getparent().remove(elem)
print etree.tostring(tree)