首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >删除XML字符串中的空格

删除XML字符串中的空格
EN

Stack Overflow用户
提问于 2010-07-22 23:34:07
回答 6查看 35.8K关注 0票数 27

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

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

代码语言:javascript
复制
xmlStr = '''<root>
    <head></head>
    <content></content>
</root>'''

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

我不能使用Python2.7,它提供了method参数。

minidom:同样的:

代码语言:javascript
复制
xmlDocument = xml.dom.minidom.parseString(xmlStr)
xmlStr = xmlDocument.toprettyxml(indent='', newl='', encoding='UTF-8')
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-07-23 17:39:30

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

代码语言:javascript
复制
>>> 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>

这可能足以满足您的需求,但为了安全起见,请注意以下几点:

这将只删除元素之间的空格节点,并尽量不删除具有混合内容的元素中的空格节点:

代码语言:javascript
复制
>>> 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>

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

代码语言:javascript
复制
>>> 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或空字符串)

票数 43
EN

Stack Overflow用户

发布于 2013-06-04 21:23:32

下面是我想出的一些快速方法,因为我不想使用lxml:

代码语言:javascript
复制
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指令,但老实说,许多其他处理XML的软件也是这样,这是一个相当有趣的要求:)而且,您可以很容易地将这种功能添加到上面的代码中(只需检查space属性,如果它的值为‘preserve’,请不要重复)。

票数 28
EN

Stack Overflow用户

发布于 2010-07-23 06:44:29

空白在XML文档中很重要。使用空格进行缩进是XML的一个不好的用法,因为它引入了实际上没有的重要数据--不幸的是,这是一种规范。您采用的任何去除空格的编程方法充其量只是一种猜测-您需要更好地了解XML所传达的信息,才能正确地删除空格,而不会触动某些数据。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3310614

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档