【问题标题】:How can I differentiate regular whitespaces and escaped ones ( ) when parsing XML with xml.etree.ElementTree (python)使用 xml.etree.ElementTree (python) 解析 XML 时,如何区分常规空格和转义空格 ()
【发布时间】:2013-12-19 07:14:27
【问题描述】:

我正在使用xml.etree.ElementTree 来解析 XML 文件。 如何强制它去除空格文本(只是常规空格,而不是 )或留下空格并忽略转义(保持原样)? 这是我的问题:

xml_text = """
<root>
    <mytag>
        data_with_space&#32;
    </mytag>
</root>"""
root = xml.etree.ElementTree.fromstring(xml_text)
mytag = root.find("mytag")
print "original text: ", repr(mytag.text)
print "stripped text: ", repr(mytag.text.strip())

打印出来:

original text:  '\n        data_with_space \n    '
stripped text:  'data_with_space'

我需要什么:

'data_with_space '

或者(我可以通过其他方式逃脱):

'data_with_space&#32;'

使用xml.etree.ElementTree 的解决方案更可取,否则我将不得不重写大量代码

【问题讨论】:

  • XML 规范将&amp;#32; 和ASCII 空格字符' ' 视为相同。您始终可以将任何字符替换为其 &amp;#...; 等效字符,而无需更改 XML 工具所理解的文件内容。试图让 XML 库将它们视为不同,您不会有任何成功 - 您需要更改输入 XML(迄今为止最好的选择,如果它在您的情况下实际上是可能的)或者做一些丑陋和不可靠的在将其解析为 XML 之前对字符串进行预处理。
  • @PeterDeGlopper 很遗憾,我对 XML 格式无能为力。它由不同的应用程序组成,我的工作是分析其中包含的数据
  • 我也去过那里。不幸的是,该应用程序提供的数据无法保持您需要做出的区分——如果 XML 解析器对&lt;mytag&gt;foo bar&lt;/mytag&gt; 的处理方式与对&lt;mytag&gt;foo&amp;#32;bar&lt;/mytag&gt; 的处理方式不同,那么它就是不正确的。字符串预处理可能是您唯一的选择,虽然很痛苦。我希望您至少可以缩小需要特别处理字符实体引用的上下文。

标签: python xml escaping html-escape-characters xml.etree


【解决方案1】:

标准 XML 库将 &amp;#32;' ' 视为相等。如果直接应用fromstring(xml_text),就无法避免均衡,因此无法区分它们。阻止转义的唯一方法是在应用 fromstring() 之前将其翻译成其他内容,然后再将其翻译回来。


import xml.etree.ElementTree

stop_escape   = lambda text: text.replace("&#", "|STOP_ESCAPE|")
resume_escape = lambda text: text.replace("|STOP_ESCAPE|", "&#")

xml_text = """
<root>
    <mytag>
        data_with_space&#32;
    </mytag>
</root>"""
root = xml.etree.ElementTree.fromstring(stop_escape(xml_text))
mytag_txt = resume_escape(root.find("mytag").text)
print "original text: ", repr(mytag_txt)
print "stripped text: ", repr(mytag_txt.strip())

你会得到:

original text:  '\n        data_with_space&#32;\n    '
stripped text:  'data_with_space&#32;'        

【讨论】:

  • 酷。我很高兴能帮上忙:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
  • 1970-01-01
  • 2013-04-07
  • 1970-01-01
  • 2023-03-12
相关资源
最近更新 更多