删除空白区域,并在一行中

时间:2014-10-13 07:06:15

标签: python

我需要使用python在xml文件中进行更改,并且需要删除下一行/空格。 例如

我试过正则表达式,但不是没有帮助。 我正在尝试打开一个input.xml并用regex替换并将输出保存为output.xml

Dim RegexObj As New Regex(">[\s]*<")
Newxml = RegexObj.Replace(OldText, "><")

Input.xml中

<Instal xmlns="http://www.test.com/abc/dfg">
<Version>
    1.1
</Version>
<alpha>
    <ns3:myname xmlns:ns3="http://www.test.com/asd/asd/cvf">
        GH12345
    </ns3:myname>
    <ns4:beta xmlns:ns4="http://www.test.com/asd/asd/cvf">
        PLAN
    </ns4:beta>
    <ns5:OperatorName xmlns:ns5="http://www.test.com/asd/asd/cvf">
        Tanho
    </ns5:OperatorName>
</alpha>
<Laptop>
    A
</Laptop>
<ID>
    2883
</ID>
<PERSON>
    <ns6:FirstName xmlns:ns6="http://www.test.com/asd/asd/cvf">
        MAMA
    </ns6:FirstName>
    <ns7:LastName xmlns:ns7="http://www.test.com/asd/asd/cvf">
        REHA
    </ns7:LastName>
</PERSON>
</Instal xmlns="http://www.test.com/abc/dfg">

的Output.xml

<Instal xmlns="http://www.test.com/abc/dfg">
<Version>1.1</Version>
<alpha>
    <ns3:> xmlns:ns3="http://www.test.com/asd/asd/cvf">GH12345</ns3:myname>
    <ns4:beta xmlns:ns4="http://www.test.com/asd/asd/cvf">PLAN</ns4:beta>
    <ns5:OperatorName xmlns:ns5="http://www.test.com/asd/asd/cvf">Tanho</ns5:OperatorName>
</alpha>
<Laptop>A</Laptop>
<ID>2883</ID>
<PERSON>
    <ns6:FirstName xmlns:ns6="http://www.test.com/asd/asd/cvf">MAM</ns6:FirstName>
    <ns7:LastName xmlns:ns7="http://www.test.com/asd/asd/cvf">REHA</ns7:LastName>
</PERSON>
</Instal xmlns="http://www.test.com/abc/dfg">

2 个答案:

答案 0 :(得分:0)

您可以使用非贪婪表达式执行此操作,并re.DOTALL选择仅包含以下内容的模式:

  • 包含姓名和可选属性的开始标记
  • 最终的新行
  • 文字但没有子标记
  • 最终的新行
  • 结束标记(与开始标记同名)

替换字符串仅删除最终的换行符

with open('input.xml') as fd:
    txt = fd.read()
rx = re.compile("(<\s*(.*?)(\s*[^>]*?)>)\s*\n*\s*([^<]*?)\s*\n*\s*(</\s*\\2\s*>)", re.DOTALL)
filtered = rx.sub("\\1\\4\\5", txt)

如果txt是您的Input.xml,则print(filtered)给出:

<Instal xmlns="http://www.test.com/abc/dfg">
<Version>1.1</Version>
<alpha>
    <ns3:myname xmlns:ns3="http://www.test.com/asd/asd/cvf">GH12345</ns3:myname>
    <ns4:beta xmlns:ns4="http://www.test.com/asd/asd/cvf">PLAN</ns4:beta>
    <ns5:OperatorName xmlns:ns5="http://www.test.com/asd/asd/cvf">Tanho</ns5:OperatorName>
</alpha>
<Laptop>A</Laptop>
<ID>2883</ID>
<PERSON>
    <ns6:FirstName xmlns:ns6="http://www.test.com/asd/asd/cvf">MAMA</ns6:FirstName>
    <ns7:LastName xmlns:ns7="http://www.test.com/asd/asd/cvf">REHA</ns7:LastName>
</PERSON>
</Instal xmlns="http://www.test.com/abc/dfg">

目前的正则表达式不允许打开和关闭标记之间的不同用例。如果需要,您必须在标志中添加re.I

答案 1 :(得分:0)

我刚使用了一个简单的正则表达式。当然,我的答案是在python 2.7中,所以这可能不适合你,具体取决于你使用的python版本。

input = ''
with open('input.xml', 'r') as input_file:
    input_file = open('input.xml', 'r')
    input = input_file.read()

import re
output = re.sub('\n\s*([^<> ]+)\s*\n\s*', '\\1', input, flags=re.MULTILINE)

with open('output.xml', 'w') as output_file:
    output_file.write(output)

这是一个有效的代表:http://repl.it/1SG/3

修改

如果您的值包含大于或小于符号,则无效。我不确定XML是如何完全工作的,但它甚至可能都不允许将这些字符作为值。