【问题标题】:How can I make lxml's parser preserve whitespace outside of the root element?如何使 lxml 的解析器保留根元素之外的空格?
【发布时间】:2010-11-01 15:58:31
【问题描述】:

我正在使用 lxml 来操作一些现有的 XML 文档,并且我想引入尽可能少的差异噪声。不幸的是,默认情况下lxml.etree.XMLParser 不会在文档的根元素之前或之后保留空格:

>>> xml = '\n    <etaoin>shrdlu</etaoin>\n'
>>> lxml.etree.tostring(lxml.etree.fromstring(xml))
'<etaoin>shrdlu</etaoin>'
>>> lxml.etree.tostring(lxml.etree.fromstring(xml)) == xml
False

这可以使用 lxml 吗?底层的libxml2是否支持?

【问题讨论】:

  • 根据 lxml 文档,在创建解析器时应该有一个 remove_blank_text 选项,但是当我将其设置为 False 并使用您的 xml 进行测试时,它似乎没有按预期工作

标签: python xml whitespace lxml


【解决方案1】:

我不知道有什么 XML 库可以为你做这件事。但是,如果您真的需要这样做,使用正则表达式听起来是个不错的主意。

>>> xml = '\n    <etaoin>shrdlu</etaoin>\n'
>>> head, tail = re.findall(r"^\s*|\s*$", xml)[:2]
>>> root = etree.fromstring(xml)
>>> out = head + etree.tostring(root) + tail
>>> out == xml
True

【讨论】:

    【解决方案2】:

    使用正则表达式捕获空格,并在完成后将其添加回字符串。

    【讨论】:

    • 我在寻找相同问题的解决方案时偶然发现了这个答案。但我不明白;你将如何真正做到这一点?例如,如果更改引入了新属性或添加了带有空格的字符串,该怎么办?你将如何恢复空白?
    • 这个答案不处理这些情况。如果修改 DOM 结构,“保留空白”的含义就会变得混乱。要处理结构更改,您真的想重建空白,而不是恢复它。
    猜你喜欢
    • 2010-10-26
    • 1970-01-01
    • 2011-09-29
    • 2020-07-19
    • 2012-09-15
    • 2022-12-19
    • 2011-04-03
    • 2019-03-13
    相关资源
    最近更新 更多