Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Python剥离XML节点之间的空格_Python_Xml_Xslt - Fatal编程技术网

用Python剥离XML节点之间的空格

用Python剥离XML节点之间的空格,python,xml,xslt,Python,Xml,Xslt,有没有一种简单的方法可以在Python中完成与xsl相同的任务: <xsl:strip-space elements="*"/> 打印出示例节点后,示例节点的子节点之间的输入文件中的所有空格和换行将被删除 我认为您需要显式地操纵子树来剥离每个文本和尾部: from xml.etree import ElementTree for event, elem in ElementTree.iterparse("/tmp/example.xml"): if elem.tag ==

有没有一种简单的方法可以在Python中完成与xsl相同的任务:

<xsl:strip-space elements="*"/>

打印出示例节点后,示例节点的子节点之间的输入文件中的所有空格和换行将被删除

我认为您需要显式地操纵子树来剥离每个文本和尾部:

from xml.etree import ElementTree

for event, elem in ElementTree.iterparse("/tmp/example.xml"):
    if elem.tag == "example":
        subiter = ElementTree.ElementTree(elem).getiterator()
        for x in subiter:
          if x.text: x.text = x.text.strip()
          if x.tail: x.tail = x.tail.strip()
        print ElementTree.tostring(elem)

一个优雅的解决方案可以有一个迭代器,它可以简单地过滤掉只有空格的文本节点:

import re

whitespaces = re.compile('\s*$')
def omit_whitespaces(iter):
    for event, elem in iter:
        if whitespaces.match(elem.text): elem.text = ''
        if whitespaces.match(elem.tail): elem.tail = ''
        yield event, elem

def strip_whitespaces(iter):
    for event, elem in iter:
        elem.text = elem.text.strip()
        elem.tail = elem.tail.strip()
        yield event, elem
然后按如下方式使用它(根据是否要在文本节点中保留带有非空白字符的空格,可以是
strip
ommit
):

注意,在这种情况下,您必须只使用“end”事件(否则解析器会给您部分数据)

但是。。。我对ElementTree不是很了解,但是我没有测试过这段代码。

如果你能使用这个模块,这会变得容易得多。发件人:

>>parser=etree.XMLParser(仅删除\u blank\u text=True)#lxml.etree!
>>>root=etree.XML(“,解析器)
>>>etree.tostring(根目录)
b“

tail属性为我做了这件事。谢谢
import re

whitespaces = re.compile('\s*$')
def omit_whitespaces(iter):
    for event, elem in iter:
        if whitespaces.match(elem.text): elem.text = ''
        if whitespaces.match(elem.tail): elem.tail = ''
        yield event, elem

def strip_whitespaces(iter):
    for event, elem in iter:
        elem.text = elem.text.strip()
        elem.tail = elem.tail.strip()
        yield event, elem
for event, elem in omit_whitespaces(ElementTree.iterparse("/tmp/example.xml")):
    if elem.tag == "example":
        print ElementTree.tostring(elem)
>>> parser = etree.XMLParser(remove_blank_text=True) # lxml.etree only!
>>> root = etree.XML("<root>  <a/>   <b>  </b>     </root>", parser)
>>> etree.tostring(root)
b'<root><a/><b>  </b></root>'