删除XML字符串中的空白

2024-09-27 20:15:09 发布

您现在位置:Python中文网/ 问答频道 /正文

如何在Python2.6中删除XML字符串中的空白和换行符?我尝试了以下程序包:

etree:此代码段保留原始空白:

xmlStr = '''<root>
    <head></head>
    <content></content>
</root>'''

xmlElement = xml.etree.ElementTree.XML(xmlStr)
xmlStr = xml.etree.ElementTree.tostring(xmlElement, 'UTF-8')
print xmlStr

我不能使用Python 2.7来提供method参数。

同样的:

xmlDocument = xml.dom.minidom.parseString(xmlStr)
xmlStr = xmlDocument.toprettyxml(indent='', newl='', encoding='UTF-8')

Tags: 字符串程序包代码段rootxmlcontenthead空白
3条回答

最简单的解决方案可能是使用lxml,在这里您可以设置一个解析器选项来忽略元素之间的空白:

>>> from lxml import etree
>>> parser = etree.XMLParser(remove_blank_text=True)
>>> xml_str = '''<root>
>>>     <head></head>
>>>     <content></content>
>>> </root>'''
>>> elem = etree.XML(xml_str, parser=parser)
>>> print etree.tostring(elem)
<root><head/><content/></root>

这可能足以满足您的需要,但有些警告是安全的:

这将只删除元素之间的空白节点,并尝试不删除包含混合内容的元素内部的空白节点:

>>> elem = etree.XML('<p> spam <a>ham</a> <a>eggs</a></p>', parser=parser)
>>> print etree.tostring(elem)
<p> spam <a>ham</a> <a>eggs</a></p>

不会删除textnodes中的前导或尾随空白。但是,在某些情况下,它仍然会从混合内容中删除空白节点:如果解析器在该级别还没有遇到非空白节点。

>>> elem = etree.XML('<p><a> ham</a> <a>eggs</a></p>', parser=parser)
>>> print etree.tostring(elem)
<p><a> ham</a><a>eggs</a></p>

如果你不想要,你可以使用xml:space="preserve",这将得到尊重。另一个选择是使用dtd并使用etree.XMLParser(load_dtd=True),在这里解析器将使用dtd来确定哪些空白节点是有效的还是无效的。

除此之外,您还必须编写自己的代码来删除不需要的空白(迭代子代,并在适当的情况下,将只包含空白的.text.tail属性设置为None或空字符串)

空白在XML文档中很重要。使用空白进行缩进是对XML的一种拙劣使用,因为它引入了真正没有的重要数据——不幸的是,这是一种规范。去除空白的任何编程方法充其量都只是一种猜测——您需要更好地了解XML所传递的内容,以便正确地删除空白,而不必踩到某个数据的脚趾。

以下是我不想使用lxml而快速想到的:

from xml.dom import minidom
from xml.dom.minidom import Node

def remove_blanks(node):
    for x in node.childNodes:
        if x.nodeType == Node.TEXT_NODE:
            if x.nodeValue:
                x.nodeValue = x.nodeValue.strip()
        elif x.nodeType == Node.ELEMENT_NODE:
            remove_blanks(x)

xml = minidom.parse('file.xml')
remove_blanks(xml)
xml.normalize()
with file('file.xml', 'w') as result:
    result.write(xml.toprettyxml(indent = '  '))

我真的只需要用其他损坏的缩进来重新缩进XML文件。它不尊重preserve指令,但是,老实说,处理XMLs的许多其他软件也是如此,这是一个相当有趣的要求:)而且,您可以很容易地将这种功能添加到上面的代码中(只需检查space属性,如果它的值是'preserve'就不会再出现)

相关问题 更多 >

    热门问题