Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何正确地从这个嵌套的XML中提取数据?_Python_Xml_Xpath_Lxml - Fatal编程技术网

Python 如何正确地从这个嵌套的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:

<?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>