感謝alecxe,我找到了解決方案。如果我們有多個item1-item5元素的實例(請參閱我對他的答案的評論以便更好地理解),他的回答對於所描述的案例完全適用,但不起作用(即使是他的更新)。
無論如何,我發現了另一種解決方案(我認爲這是更簡單,更符合Python):
from lxml.etree import fromstring, tostring
data = """<FirstLevel>
<item1>Val1</item1>
<item2>Val2</item2>
<item3>Val3</item3>
<item4>Val4</item4>
<item5>Val5</item5>
<item1>Val1</item1>
<item2>Val2</item2>
<item3>Val3</item3>
<item4>Val4</item4>
<item5>Val5</item5>
</FirstLevel>
"""
tree = fromstring(data)
item1_list = tree.findall("item1")
for item1 in item1_list:
next_node = item1.getnext()
while next_node.tag != "item5":
tree.remove(next_node)
next_node = item1.getnext()
print(tostring(tree))
還有一個從alecxe評論這對我的作品來了一個解決方案:
從lxml.etree import fromstring,tostring
data = """<FirstLevel>
<item1>Val1</item1>
<item2>Val2</item2>
<item3>Val3</item3>
<item4>Val4</item4>
<item5>Val5</item5>
<item1>Val1</item1>
<item2>Val2</item2>
<item3>Val3</item3>
<item4>Val4</item4>
<item5>Val5</item5>
<item1>Val1</item1>
<item2>Val2</item2>
<item3>Val3</item3>
<item4>Val4</item4>
<item5>Val5</item5>
</FirstLevel>
"""
tree = fromstring(data)
node_start = "item1"
node_end = "item5"
parent = tree.xpath("//FirstLevel")[0]
# Remove first section
for node in parent.xpath("*[(preceding-sibling::item1)[1] and (following-sibling::item5)[3]]"):
parent.remove(node)
# Remove second section
for node in parent.xpath("*[(preceding-sibling::item1)[2] and (following-sibling::item5)[2]]"):
parent.remove(node)
# Remove last section
for node in parent.xpath("*[(preceding-sibling::item1)[3] and (following-sibling::item5)[last()]]"):
parent.remove(node)
print(tostring(tree))
我找到了正確的索引來把我n preceding-
和following-sibling
通過嘗試多個值,但仍然沒有真正得到它的邏輯,但它至少對我有效。
在Python中,讀取文件通常要容易得多,刪除所需的部分然後重寫文件。它可能與您使用的模塊idk不同。 –
感謝您的快速回答。在我的情況下,訪問該文件很困難,因爲它在更大的用例中存在,但是如果我找不到其他解決方案,我會考慮它:) – filaton