2017-04-24 116 views
1

我使用Python ElementTree/lxml(pydev)解析xml文件。從基於關鍵字搜索的python使用xml文件提取值

編輯:整個XML文件:

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

我試圖提取含有 '迴轉' 在評論關鍵字所有signalnames。 XML文件包含更多'帶有或不帶'CHANNEL'子元素的'PNIODEV'。

目前,我有我無法使用LXML或ElementTree的相應Signalnames所有評論和打印只搜索關鍵字「旋轉式」與

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

打印出所有的評論。 我用下面的代碼:

for word in root.xpath('.//CHANNEL[COMMENT[contains(text(),"ROTARY")]]"/COMMENT/text()'): 
print (word) 

沒有得到任何輸出...

由於我是新來的Python和XML,任何幫助將不勝感激。

回答

0

或者xml.etree.ElementTree您可以使用BeautifulSoup解析XML內容。

這段代碼:

  1. 使用XML內容
  2. 搜索的<CHANNEL></CHANNEL>標籤
  3. 所有出現爲<CHANNEL>每次出現創建soup,它會搜索裏面的字'ROTARY'<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) 

輸出:

<signalname>ELE+S1-BGI51.2</signalname> 
<signalname>ELE+S1-BGI51.3</signalname> 
<signalname>ELE+S1-BGI51.4_4C</signalname> 

編輯:

您可以使用try/except語句繞過AttributeError

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

謝謝......我會用BeautifulSoup試試。 – vrindakm

+0

我很抱歉沒有幫助你處理'xml.etree'錯誤。我對這個庫不太瞭解。至少我的代碼能夠產生你想要的結果。 :P –

+0

我爲find_all('CHANNEL')本身得到一個空數組 – vrindakm

0

,您就能獲得輸出,僅使用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 
0

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 

輸出:

ELE+S1-BGI51.0_6C 
ELE+S1-BGI51.1_6C 
ELE+S1-BGI51.2 
ELE+S1-BGI51.3 
ELE+S1-BGI51.4_4C 
ELE+S1-BGI51.5_4C 
ELE+S1-BGI51.6 
ELE+S1-BGI51.7 
ELE+S1-BGI52.0 
... 
+0

我試過這個...有這個錯誤:'Traceback(最近調用最後一個): 文件「C:\ Users \\ Pkg1 \ Py1.py」,第33行, 如果節點中有「ROTARY」 find(「.// COMMENT」)。text: AttributeError:'NoneType'對象沒有屬性'text' – vrindakm

+0

請發佈一個有效的xml以獲得適當的幫助。 –

+0

我的xml文件非常龐大..所以我不確定是否添加了所有內容 – vrindakm

0

使用XPath

import xml.etree.ElementTree as ET 
tree =ET.parse('Project.xml').getroot() 
all_items = root.findall("HARDWARE/PNIODEVICE/PNIOSLOT/CHANNEL") 
lines = [item.find('SIGNALNAME').text for item in all_items if 'ROTARY' in item.find('COMMENT').text] 
print lines 

編輯:您必須指定通道可能沒有評論標籤!

import xml.etree.ElementTree as ET 
root =ET.parse('project.xml').getroot() 
all_items = root.findall("HARDWARE/PNIODEVICE/PNIOSLOT/CHANNEL") 
lines = [item.find('SIGNALNAME').text for item in all_items if item.find('COMMENT') is not None and 'ROTARY' in item.find('COMMENT').text] 
print lines 
+0

嗨..我在這裏也得到了同樣的錯誤..'lines = [item.find('SIGNALNAME')。item.find('COMMENT')中的'ROTARY'在all_items中的文本文本] AttributeError: 'NoneType'對象沒有屬性'text' – vrindakm

相關問題