我有一个xml文件如下
<Person>
<name>
My Name
</name>
<Address>My Address</Address>
</Person>
标签有额外的新行,是否有任何快速的Pythonic方法来修剪它并生成一个新的xml。
我找到了这个,但它只修剪标签之间的值而不是值 https://skyl.org/log/post/skyl/2010/04/remove-insignificant-whitespace-from-xml-string-with-python/
更新1 - 处理以下xml,其中<name>
代码中有尾部空格
<Person>
<name>
My Name<shortname>My</short>
</name>
<Address>My Address</Address>
</Person>
两种xml的
以上的接受答案句柄更新2 - 我在下面的回答中发布了我的版本,我使用它来删除所有类型的空格,并使用xml编码生成漂亮的xml文件
答案 0 :(得分:4)
使用lxml
,您可以迭代所有元素,并检查它是否包含strip()
的文字:
from lxml import etree
tree = etree.parse('xmlfile')
root = tree.getroot()
for elem in root.iter('*'):
if elem.text is not None:
elem.text = elem.text.strip()
print(etree.tostring(root))
它产生:
<Person><name>My Name</name>
<Address>My Address</Address>
</Person>
更新以剥离tail
文字:
from lxml import etree
tree = etree.parse('xmlfile')
root = tree.getroot()
for elem in root.iter('*'):
if elem.text is not None:
elem.text = elem.text.strip()
if elem.tail is not None:
elem.tail = elem.tail.strip()
print(etree.tostring(root, encoding="utf-8", xml_declaration=True))
答案 1 :(得分:3)
Birei使用lxml给出的接受的答案完美地完成了这项工作,但我想修剪所有类型的白色/空白,空行并在xml文件中重新生成漂亮的xml。
以下代码做了我想要的事情
from lxml import etree
#discard strings which are entirely white spaces
myparser = etree.XMLParser(remove_blank_text=True)
root = etree.parse('xmlfile',myparser)
#from Birei's answer
for elem in root.iter('*'):
if elem.text is not None:
elem.text = elem.text.strip()
if elem.tail is not None:
elem.tail = elem.tail.strip()
#write the xml file with pretty print and xml encoding
root.write('xmlfile', pretty_print=True, encoding="utf-8", xml_declaration=True)
答案 2 :(得分:2)
您必须以这种或那种方式进行xml解析,因此可以使用xml.sax
并在每个事件中复制到输出流(跳过ignorableWhitespace
),并根据需要添加标记标记。请在此处查看示例代码http://www.knowthytools.com/2010/03/sax-parsing-with-python.html。
答案 3 :(得分:1)
您可以使用beautifulsoup。遍历所有元素以及包含某些文本的每个元素,将其替换为其剥离版本:
from bs4 import BeautifulSoup
soup = BeautifulSoup(open('xmlfile', 'r'), 'xml')
for elem in soup.find_all():
if elem.string is not None:
elem.string = elem.string.strip()
print(soup)
假设xmlfile
包含问题中提供的内容,则会产生:
<?xml version="1.0" encoding="utf-8"?>
<Person>
<name>My Name</name>
<Address>My Address</Address>
</Person>
答案 4 :(得分:1)
我正在使用旧版本的Python(2.3),并且目前只能使用标准库。为了显示一个向后兼容的答案,我已经用xml.dom
和xml.minidom
函数编写了这个代码。
import codecs
from xml.dom import minidom
# Read in the file to a DOM data structure.
original_document = minidom.parse("original_document.xml")
# Open a UTF-8 encoded file, because it's fairly standard for XML.
stripped_file = codecs.open("stripped_document.xml", "w", encoding="utf8")
# Tell minidom to format the child text nodes without any extra whitespace.
original_document.writexml(stripped_file, indent="", addindent="", newl="")
stripped_file.close()
虽然不是BeautifulSoup
,但此解决方案非常优雅,并使用了较低级API的全部功能。请注意,实际的格式只是一行:)
此处使用的API调用文档: