<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-处理以下带有在
<name>
标签中带有尾部空格的xml <Person>
<name>
My Name<shortname>My</short>
</name>
<Address>My Address</Address>
</Person>
以上两种方法均接受答案的XML的更新
更新2-我在下面的答案中发布了我的版本,我正在使用它删除所有类型的空格并使用xml编码在文件中生成漂亮的xml
https ://stackoverflow.com/a/19396130/973699
#1 楼
使用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))
它产生:
更新也剥去
tail
文本:<Person><name>My Name</name>
<Address>My Address</Address>
</Person>
评论
完美可以正常工作,唯一的问题是它不会保留<?xml version =“ 1.0” encoding =“ UTF-8”?>之类的xml版本标记。
– DevC
13-10-15在10:47
@DevC:您的数据不包含它。您可以在打印时添加它:print(etree.tostring(root,encoding =“ utf-8”,xml_declaration = True))
– Birei
13-10-15在11:00
不,我尝试的实际xml文件具有此功能,但最终结果未显示此信息。我不想对其进行硬编码,因为它可能会更改。
– DevC
13-10-15在11:06
我一直在接受您的回答,但在上述更新条件下不起作用
– DevC
13-10-15在17:19
@DevC:元素的混合内容在两侧都用文本包围,可以使用也可以剥离的tail属性提取。我已经更新了答案以适应您的新情况。
– Birei
13-10-15在20:15
#2 楼
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)
#3 楼
您必须以一种或另一种方式进行xml解析,因此也许使用xml.sax
并在每个事件处复制到输出流(跳过ignorableWhitespace
),并根据需要添加标签标记。在此处检查示例代码http://www.knowthytools.com/2010/03/sax-parsing-with-python.html。评论
如果您举一个例子,那将真的有帮助。无法从工作中获得链接,它是这里唯一兼容2.3版本的标准库。
–约书亚·德特维尔(Joshua Detwiler)
18年7月20日在14:03
#4 楼
您可以使用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>
评论
我假设BeautifulSoup将抽象xml的一些细节,所以他最好直接处理lxml或其他解析器以具有通用的解决方案,除非控制他的xml。
–巴塞尔Shishani
13-10-10在12:55
@Birei是,正如巴塞尔所提到的,我正在寻找使用诸如lxml / etree或minidom之类的xml解析器进行处理
– DevC
13-10-10在23:45
#5 楼
我正在使用旧版本的Python(2.3),并且目前仍在使用标准库。为了显示一个向后兼容的答案,我已经使用xml.dom
和xml.minidom
函数编写了此函数。低级API的全部功能。请注意,实际的格式仅是一行:) 此处使用的API调用文档:
BeautifulSoup
minidom.parse
minidom.Node.writexml
评论
JSON可能会带来更大的成功@Temere这已被其他应用程序使用,并且在进入我的python程序进行验证之前
您的其他示例(接受的答案不起作用)的格式不正确。请注意开始和结束标记。顺便说一句,您正在“移动球门柱”。我想你应该问一个新问题。
@mzjn是的,我本可以问一个不同的问题,但我认为这是相关的,因此,如果此线程本身中存在最佳解决方案,那将是很好的。我已经将我的版本发布在答案stackoverflow.com/a/19396130/973699
@mzjn我刚刚读过这篇,下次我会照顾的。 meta.stackexchange.com/questions/153360 / ...