我需要使用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">
答案 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是如何完全工作的,但它甚至可能都不允许将这些字符作为值。