我有一个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-处理以下带有在<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

评论

JSON可能会带来更大的成功

@Temere这已被其他应用程序使用,并且在进入我的python程序进行验证之前

您的其他示例(接受的答案不起作用)的格式不正确。请注意开始和结束标记。顺便说一句,您正在“移动球门柱”。我想你应该问一个新问题。

@mzjn是的,我本可以问一个不同的问题,但我认为这是相关的,因此,如果此线程本身中存在最佳解决方案,那将是很好的。我已经将我的版本发布在答案stackoverflow.com/a/19396130/973699

@mzjn我刚刚读过这篇,下次我会照顾的。 meta.stackexchange.com/questions/153360 / ...

#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.domxml.minidom函数编写了此函数。低级API的全部功能。请注意,实际的格式仅是一行:)

此处使用的API调用文档:


BeautifulSoup
minidom.parse
minidom.Node.writexml