使用Python从XML文件中提取值,基于关键词搜索

2024-09-28 19:10:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用pythonelementtree/lxml(pydev)解析xml文件。在

编辑:完整的xml文件:

[https://pastebin.com/embed_js/Gbrv9wgG]

我正在尝试提取所有包含“ROTARY”作为注释关键字的信号名。XML文件包含更多的“PNIODEV”,包含或不包含“CHANNEL”子级。在

目前,我已经把所有的评论都打印出来了

import xml.etree.ElementTree as ET
tree=ET.parse('Project.xml')
root=tree.getroot()
for comments in root.iter('COMMENT')
  print(comments.text)

我无法使用lxml或elementtree在所有评论中只搜索关键字“ROTARY”并打印相应的信号名称。 我使用了以下代码:

^{pr2}$

没有得到任何输出。。。在

由于我对Python和XML还不熟悉,任何帮助都将不胜感激。在


Tags: 文件tree编辑信号评论root关键字xml
3条回答

只能使用Etree获取输出: 如本文所述(我建议您仔细阅读本文档)https://docs.python.org/2/library/xml.etree.elementtree.html:子节点是嵌套的,我们可以通过索引访问特定的子节点

所以,你可以这样做:

for i in root[0][0][0]: # looping over CHANNELS
    if 'ROTARY' in i[5].text: # if 'ROTARY' is in COMMENT
        print i[4].text # print corresponding SIGNALNAME

也可以使用xml.etree.ElementTree来解析XML内容。在

此代码将:

  1. 使用XML内容创建soup
  2. 搜索所有出现的<CHANNEL></CHANNEL>标记
  3. 对于每次出现的<CHANNEL>,它将在<COMMENT>标记中搜索单词{}。在
  4. 如果找到单词'ROTARY',它将在<SIGNALNAME>标记处打印值。在

示例代码:

s = '''<PROJECT>
          <HARDWARE CONFIGURATION>
             <PNIODEVICE>
                <PNIOSLOT>               
            <CHANNEL>
             <INDEX>2</INDEX>
             <SUBADR>0</SUBADR>
             <CHTYPE>E</CHTYPE>
             <MASK>4</MASK>
             <SIGNALNAME>ELE+S1-BGI51.2</SIGNALNAME>
             <COMMENT>ROTARY TRANSFER RADIAL ALIGNMENT 00SWIV</COMMENT>
             </CHANNEL>
            <CHANNEL>
             <INDEX>3</INDEX>
             <SUBADR>0</SUBADR>
             <CHTYPE>E</CHTYPE>
             <MASK>8</MASK>
             <SIGNALNAME>ELE+S1-BGI51.3</SIGNALNAME>
             <COMMENT>ROTARY TRANSFER RADIAL ALIGNMENT 1800SW</COMMENT>
             </CHANNEL>
            <CHANNEL>
             <INDEX>4</INDEX>
             <SUBADR>0</SUBADR>
             <CHTYPE>E</CHTYPE>
             <MASK>10</MASK>
             <SIGNALNAME>ELE+S1-BGI51.4_4C</SIGNALNAME>
             <COMMENT>ROTARY TRANSFER TRANSPORT ARM RIGHT 00R</COMMENT>
             </CHANNEL>
        </PNIOSLOT>
        </PNIODEV>
        </HARDWARE>
</PROJECT>'''

from bs4 import BeautifulSoup

soup = BeautifulSoup(s, 'lxml')

channel_tags = soup.find_all('channel')

for channel in channel_tags:
    if 'ROTARY' in channel.comment.text:
        print(channel.signalname)

输出:

^{pr2}$

编辑:

可以使用try/except语句绕过AttributeError。在

for channel in channel_tags:
    try:
        if 'ROTARY' in channel.comment.text:
            print(channel.signalname)
    except:
        continue

您的xml包含无效字符&,可以用&amp;替换它们。
修复xml后,可以使用:

import xml.etree.ElementTree as ET
tree=ET.parse('xml_test.xml')
for channel in tree.findall('.//CHANNEL'):
    if channel.find('COMMENT') is not None:
        comment = channel.find('COMMENT')
        if comment.text is not None:
            if "ROTARY" in comment.text:
                print channel.find('SIGNALNAME').text

输出:

^{pr2}$

相关问题 更多 >