2016-03-15 61 views
0

我以XML文件作爲輸入,必須使用關鍵字搜索,例如GENTEST05。 如果找到了,那麼我需要拿起它的父節點(在這個例子中我想拿起<ScriptElement>),然後用一個新的內容替換整個節點<ScriptElement>blahblah</ScriptElement>使用Python修改XML節點

... 
... 
<ScriptElement> 
<ScriptElement> 
<ScriptElement> 
    <ElementData xsi:type="anyData"> 
     <DeltaTime> 
     <Area> 
     <Datatype>USER PROMPT [GENTEST05]</Datatype> 
     <Description /> 
     <Multipartmessage>False<Multipartmessage> 
     <Comment>false</Comment> 
    </ElementData> 
</ScriptElement> 
<ScriptElement> 
<ScriptElement> 
... 
... 
... 

我想使用Beautifulsoup來做到這一點。這是我迄今爲止所做的,但沒有得到正確的方法來進行。除了美麗之外,ElementTree或任何其他建議都是值得歡迎的。

import sys 
from BeautifulSoup import BeautifulStoneSoup as bs 
xmlsoup = bs(open('file_xml' , 'r')) 

a = raw_input('Enter Text') 
paraText = xmlsoup.findAll(text=a) 
print paraText 
print paraText.findParent() 

回答

0

好的,這裏有一些示例代碼,讓你開始。我使用ElementTree是因爲它是一個內置模塊,非常適合這種類型的任務。

這裏是我使用的XML文件:

<?xml version="1.0" ?> 
<Script> 
    <ScriptElement/> 
    <ScriptElement/> 
    <ScriptElement> 
     <ElementData> 
      <DeltaTime/> 
      <Area/> 
      <Datatype>USER PROMPT [GENTEST05]</Datatype> 
      <Description/> 
      <Multipartmessage>False</Multipartmessage> 
      <Comment>false</Comment> 
     </ElementData> 
    </ScriptElement> 
    <ScriptElement/> 
    <ScriptElement/> 
</Script> 

這裏是Python程序:

import sys 
import xml.etree.ElementTree as ElementTree 

tree = ElementTree.parse("test.xml") 
root = tree.getroot() 

#The keyword to find and remove 
keyword = "GENTEST05" 

for element in list(root): 

    for sub in element.iter(): 

     if sub.text and keyword in sub.text: 
      root.remove(element) 
      print ElementTree.tostring(root) 
      sys.exit() 

我遵守了程序簡單,讓您可以改進它。由於您的XML有一個根節點,因此我假設您想要直接移除根的關鍵字匹配元素的所有父元素。在ElementTree中,您可以調用root.remove()以刪除作爲關鍵字匹配元素的祖先的<ScriptElement>元素。

這只是爲了讓你開始:這將只會刪除第一個元素,然後打印生成的樹並退出。

輸出:

<Script> 
    <ScriptElement /> 
    <ScriptElement /> 
    <ScriptElement /> 
    <ScriptElement /> 
</Script> 
+0

感謝您的響應。對於行'如果sub.text中的sub.text和關鍵字:'出錯'str obj不可調用' – Shaun

+0

嗯,這個錯誤聽起來像你試圖使用一個字符串作爲一個函數,就像這樣:''imastring「() '。確保你的字符串變量都沒有連接到它們的意外函數調用。如果你無法弄清楚,請打開一個新問題。祝你好運! – pholtz