你如何使用Python的xml库来解析字符&?

时间:2014-10-06 21:42:00

标签: python xml

我正在运行以下代码,但是我得到的结果是隐藏&字符后面的字符串。有没有办法可以强制遍历xml中的子项并返回正确的文本?

import xml.etree.ElementTree as ET
file="/home/pi/bin/test/test_xml3.xml"
parser = ET.XMLParser(encoding="ascii")

root = ET.parse(file)

for elements in root.iter('kiddy'): #iterate through each element
    print elements.text

引起问题的示例文件就是这个,特别是结果删除了 amp; 字符串:

<root>
<kiddy> shghsgdh &amp; sdjhgsjhsjdh &amp; sjhsjhdsjdh </kiddy>
<kiddy> xxxx &amp; xxxxx &amp; xxxxx </kiddy>
</root>

如您所见,输出缺少 amp; 字符串:

shghsgdh & sdjhgsjhsjdh & sjhsjhdsjdh
xxxx & xxxxx & xxxxx

2 个答案:

答案 0 :(得分:1)

输出because中缺少

amp;

  

&符号(&amp;)和左尖括号(&lt;)仅在用作标记分隔符时或在注释,处理指令或CDATA部分中时才以其文字形式出现。如果在别处需要它们,则必须使用数字字符引用或字符串“&amp; amp;”对它们进行转义。和“&amp; lt;”。

因此,当解析器遇到&amp;时,它会将其解析为一个&

如果您真的对原始字符串感兴趣,建议您通过CDATA sectionCDATA部分以<![CDATA[开头并以{{1}结尾}),如下:

]]>

This is a link简要介绍了这个问题。


为了更好地说明这一点,我将向您展示如何使用您更新的示例(为了完整起见,我添加了另一行包含字符串<root> <kiddy> shghsgdh ; sdjhgsjhsjdh ; sjhsjhdsjdh </kiddy> <kiddy name="All Shows" thumb="special://home/addons/plugin.video.plexbmc/resources/plex.png"><![CDATA[ActivateWindow(10025,&quot;plugin://plugin.video.plexbmc/?mode=0&amp;url=http%3a%2f%2f192.168.0.1%3a32400%2flibrary%2fsections%2f2%2fall&quot;,return)]]></kiddy> </root> ):

&quot;

或者,您也可以通过在每个<root> <kiddy><![CDATA[ shghsgdh &amp; sdjhgsjhsjdh &amp; sjhsjhdsjdh ]]></kiddy> <kiddy><![CDATA[ xxxx &amp; xxxxx &amp; xxxxx ]]></kiddy> <kiddy><![CDATA[ xxxx &quot; xxxxx &quot; xxxxx ]]></kiddy> </root> 字符后添加字符串&来转义您想要的特定amp;字符,从而创建转义字符串&它被解析为&amp;。这可以安全地跟随您的原始字符串(&amp;),而不用担心它被转义,因为它没有以字符quot;作为前缀。我希望一个例子可以澄清这一点(想象一下如何将每个&解析为字符&amp;):

&

答案 1 :(得分:1)

amp;不是&amp;&ElementTree的XML表示 - 它正在为您解码。如果使用text = re.sub(r'"', r"&quot;", text) text = re.sub(r"&", r"&amp;", text) 生成XML,则会发生相反的情况,因此无需担心 - 只需使用已解码的文本即可。

但是如果你真的需要出于某种原因在字符串中看到XML实体,你可以随时编辑它们:

xml.dom.minidom

编辑如果您真的想要重新转义XML实体,那么最好使用库函数,可能是ElementTree,如here所述。但我想不出有什么好理由你需要这样做;如果使用库生成XML,则甚至无法使用转义字符串,因为库将逃脱转义。 {{1}}为您提供的 ASCII(或unicode,但这与实体转义无关),您应该使用它。