使用python从xml文件中删除两个字符串之间的所有行

时间:2014-11-18 14:14:07

标签: python xml python-2.6

我正在编写一个脚本,用以下数据检查一个简短的xml文件:

示例:

<manager>
    <name="adi" lastName="kant">
        <info ip="10.12.180.107" platform="linux" user="root" password="dangerous"/>
    </name>
    <name="dino" lastName="kant">
        <info ip="10.12.180.108" platform="linux" user="root" password="dangerous"/>
    </name>
</manager>

我正在尝试创建一个python脚本,该脚本将查看此xml文件并删除所选的名称信息。

示例:

removeData(xmlFile)
print xmlFile
<manager>
    <name="dino" lastName="kant">
        <info ip="10.12.180.108" platform="linux" user="root" password="dangerous"/>
    </name>
</manager>

我唯一可以解决的问题是将文件读取到我想删除的名称,然后将其附加到一个列表中,然后在我希望删除的名称后从名称中读取文件并将其附加到另一个名称列表,合并这两个列表并将其打印到我的文件中。

示例:

h = open("/home/service/chimera/array_cert/test.txt", "r")
output = []
lines = h.readlines()
for line in lines:
    if '<name="adi"' in line: 
        break
    output.append(line)
i = 0
for line in lines:
    i+=1
    if '<name="dino"' in line:
        break
for line in lines[i:]:
    output.append(line)
h.close()
h = open("/home/service/chimera/array_cert/test.txt", "w")
h.truncate()
for line in output:
    h.write(line)

但这似乎是不必要的复杂。有更简单的方法吗?

我也在Linux系统上使用python 2.6。

2 个答案:

答案 0 :(得分:1)

使用SAX解析器,例如xml.sax。这为您提供回调,因为它扫描XML文件中的每个xml标记或“事件”。 (即打开标签,关闭标签,查看属性,查看某些数据等)。跟踪您是否属于您执行或不想保留(或删除)的XML文件,因为您获得了这些回调。如果您在&#34;保持&#34;将数据流式传输到新文件中模式,否则不会。

在处理XML时,总是使用某种适当的解析器。尝试使用正则表达式或以其他方式尝试自己做的危险已经well documented

答案 1 :(得分:1)

您是否需要保留与源文件中相同的格式?如果没有,可能你只需要解析XML并输出一个新的XML文件。

如果您可以信任源中的XML,以便在不同的行上显示<name...></name>,则可以稍微修改一下代码:

h = open("test1.txt", "r")
output = []
lines = h.readlines()
foroutput = 1
for line in lines:
    if '<name="adi"' in line:
        foroutput = 0
    if foroutput==1:
        output.append(line)
    elif '</name>' in line:
        foroutput = 1
h.close()
h = open("test2.txt", "w")
h.truncate()
for line in output:
    h.write(line)
h.close()