4

我有一个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/

<name>更新 1 - 处理标签中有尾空格的以下 xml

<Person>
<name>

 My Name<shortname>My</short>

</name>
<Address>My Address</Address>
</Person>

以上两种xml都接受的答案句柄

更新 2 - 我在下面的答案中发布了我的版本,我正在使用它来删除所有类型的空格并在带有 xml 编码的文件中生成漂亮的 xml

https://stackoverflow.com/a/19396130/973699

4

5 回答 5

5

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))
于 2013-10-11T06:19:58.677 回答
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)
于 2013-10-16T05:50:35.920 回答
2

您必须以这种或另一种方式进行 xml 解析,因此可能会xml.sax在每个事件(跳过)处使用并复制到输出流ignorableWhitespace,并根据需要添加标记标记。在此处查看示例代码http://www.knowthytools.com/2010/03/sax-parsing-with-python.html

于 2013-10-10T12:01:34.237 回答
1

您可以使用。遍历所有元素,对于每个包含一些文本的元素,将其替换为其剥离版本:

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>
于 2013-10-10T12:24:22.423 回答
1

我正在使用旧版本的 Python (2.3),我目前坚持使用标准库。为了显示一个非常向后兼容的答案,我用xml.domandxml.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 调用文档:

于 2018-07-20T15:01:00.780 回答