使用Python修改XML节点

时间:2016-03-15 06:59:24

标签: python xml python-2.7 parsing

我将XML文件作为输入,必须使用关键字GENTEST05进行搜索。 如果找到,那么我需要选择其父节点(在此示例中,我想要选择<ScriptElement>),然后用新内容替换完整节点<ScriptElement>blahblah</ScriptElement>

...
...
<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。这是我到目前为止所做的,但没有得到正确的方法继续。除了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()

1 个答案:

答案 0 :(得分: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>