Python 如何正确地从这个嵌套的XML中提取数据?
我有以下XML:Python 如何正确地从这个嵌套的XML中提取数据?,python,xml,xpath,lxml,Python,Xml,Xpath,Lxml,我有以下XML: <?xml version="1.0" encoding="UTF-8"?> <data> <columns> <Leftover index="5">Leftover</Leftover> <NODE5 index="6"></NODE5> <NODE6 index="7
<?xml version="1.0" encoding="UTF-8"?>
<data>
<columns>
<Leftover index="5">Leftover</Leftover>
<NODE5 index="6"></NODE5>
<NODE6 index="7"></NODE6>
<NODE8 index="9"></NODE8>
<Nomenk__Nr_ index="2">Nomenk.
Nr.</Nomenk__Nr_>
<Year index="8">2020</Year>
<Name index="1">Name</Name>
<Value_code index="3">Value code</Value_code>
</columns>
<records>
<record index="1">
<Leftover>Leftover</Leftover>
<NODE5>Test1</NODE5>
<NODE6>Test2</NODE6>
<NODE8>Test3</NODE8>
<Nomenk__Nr_></Nomenk__Nr_>
<Name></Name>
<Value_code></Value_code>
</record>
... (it repeats itself with different values and the index value increments)
我需要做的是移除节点5,节点6,节点8。我尝试使用通配符,然后指定一个节点(参见第6行),但这似乎不起作用。。。在第一个字符的循环之后,我也得到了一个语法错误,但是代码执行了
我的问题还在于,当文件“导出”后,lxml的编码设置为ASCII
更新
我在第8行遇到这个错误:
return = ...
^
SyntaxError: invalid syntax
我从你的电脑上取了一些代码
我需要做的是移除节点5,节点6,节点8
下面
将xml.etree.ElementTree作为ET导入
xml=“”
残存物
诺门克。
编号。
2020
名称
值代码
残存物
测试1
测试2
测试3
残存物
测试11
测试21
测试39
'''
root=ET.fromstring(xml)
col=root.find(“./columns”)
对于['5','6','8']中的x:
nodes_to_remove=col.findall('./节点{}.format(x))
对于要删除的节点中的节点:
列移除(节点)
记录=根目录。查找(“./records”)
records_lst=records.findall('./记录'.格式(x))
对于记录中的r\u lst:
对于['5','6','8']中的x:
nodes_to_remove=r.findall('./节点{}'。格式(x))
对于要删除的节点中的节点:
r、 删除(节点)
ET.dump(根目录)
输出
<data>
<columns>
<Leftover index="5">Leftover</Leftover>
<Nomenk__Nr_ index="2">Nomenk.
Nr.</Nomenk__Nr_>
<Year index="8">2020</Year>
<Name index="1">Name</Name>
<Value_code index="3">Value code</Value_code>
</columns>
<records>
<record index="1">
<Leftover>Leftover</Leftover>
<Nomenk__Nr_ />
<Name />
<Value_code />
</record>
<record index="2">
<Leftover>Leftover</Leftover>
<Nomenk__Nr_ />
<Name />
<Value_code />
</record>
</records>
</data>
残存物
诺门克。
编号。
2020
名称
值代码
残存物
残存物
“在第一个字符的循环之后,我也发现了一个语法错误,但是代码执行了”-请将错误粘贴到这里。“但这似乎不起作用”——不清楚这意味着什么。实际输出和您期望的输出之间有什么区别?了解您的Python版本也会很有帮助。谢谢如果您愿意的话,我们很高兴承认这一点。@MathiasMüller更新了问题,该代码必须在所有列
和记录
节点中搜索3次,我认为这实际上是不必要的。
import xml.etree.ElementTree as ET
xml = '''<?xml version="1.0" encoding="UTF-8"?>
<data>
<columns>
<Leftover index="5">Leftover</Leftover>
<NODE5 index="6" />
<NODE6 index="7" />
<NODE8 index="9" />
<Nomenk__Nr_ index="2">Nomenk.
Nr.</Nomenk__Nr_>
<Year index="8">2020</Year>
<Name index="1">Name</Name>
<Value_code index="3">Value code</Value_code>
</columns>
<records>
<record index="1">
<Leftover>Leftover</Leftover>
<NODE5>Test1</NODE5>
<NODE6>Test2</NODE6>
<NODE8>Test3</NODE8>
<Nomenk__Nr_ />
<Name />
<Value_code />
</record>
<record index="21">
<Leftover>Leftover</Leftover>
<NODE5>Test11</NODE5>
<NODE6>Test21</NODE6>
<NODE8>Test39</NODE8>
<Nomenk__Nr_ />
<Name />
<Value_code />
</record>
</records>
</data>'''
root = ET.fromstring(xml)
col = root.find('./columns')
for x in ['5','6','8']:
nodes_to_remove = col.findall('./NODE{}'.format(x))
for node in nodes_to_remove:
col.remove(node)
records = root.find('./records')
records_lst = records.findall('./record'.format(x))
for r in records_lst:
for x in ['5','6','8']:
nodes_to_remove = r.findall('./NODE{}'.format(x))
for node in nodes_to_remove:
r.remove(node)
ET.dump(root)
<data>
<columns>
<Leftover index="5">Leftover</Leftover>
<Nomenk__Nr_ index="2">Nomenk.
Nr.</Nomenk__Nr_>
<Year index="8">2020</Year>
<Name index="1">Name</Name>
<Value_code index="3">Value code</Value_code>
</columns>
<records>
<record index="1">
<Leftover>Leftover</Leftover>
<Nomenk__Nr_ />
<Name />
<Value_code />
</record>
<record index="2">
<Leftover>Leftover</Leftover>
<Nomenk__Nr_ />
<Name />
<Value_code />
</record>
</records>
</data>