我正在运行以下代码,但是我得到的结果是隐藏&
字符后面的字符串。有没有办法可以强制遍历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 & sdjhgsjhsjdh & sjhsjhdsjdh </kiddy>
<kiddy> xxxx & xxxxx & xxxxx </kiddy>
</root>
如您所见,输出缺少 amp; 字符串:
shghsgdh & sdjhgsjhsjdh & sjhsjhdsjdh
xxxx & xxxxx & xxxxx
答案 0 :(得分:1)
amp;
:
&符号(&amp;)和左尖括号(&lt;)仅在用作标记分隔符时或在注释,处理指令或CDATA部分中时才以其文字形式出现。如果在别处需要它们,则必须使用数字字符引用或字符串“&amp; amp;”对它们进行转义。和“&amp; lt;”。
因此,当解析器遇到&
时,它会将其解析为一个&
。
如果您真的对原始字符串感兴趣,建议您通过CDATA
section(CDATA
部分以<![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,"plugin://plugin.video.plexbmc/?mode=0&url=http%3a%2f%2f192.168.0.1%3a32400%2flibrary%2fsections%2f2%2fall",return)]]></kiddy>
</root>
):
"
或者,您也可以通过在每个<root>
<kiddy><![CDATA[ shghsgdh & sdjhgsjhsjdh & sjhsjhdsjdh ]]></kiddy>
<kiddy><![CDATA[ xxxx & xxxxx & xxxxx ]]></kiddy>
<kiddy><![CDATA[ xxxx " xxxxx " xxxxx ]]></kiddy>
</root>
字符后添加字符串&
来转义您想要的特定amp;
字符,从而创建转义字符串&
它被解析为&
。这可以安全地跟随您的原始字符串(&
或amp;
),而不用担心它被转义,因为它没有以字符quot;
作为前缀。我希望一个例子可以澄清这一点(想象一下如何将每个&
解析为字符&
):
&
答案 1 :(得分:1)
amp;
不是&
,&
是ElementTree
的XML表示 - 它正在为您解码。如果使用text = re.sub(r'"', r""", text)
text = re.sub(r"&", r"&", text)
生成XML,则会发生相反的情况,因此无需担心 - 只需使用已解码的文本即可。
但是如果你真的需要出于某种原因在字符串中看到XML实体,你可以随时编辑它们:
xml.dom.minidom
编辑如果您真的想要重新转义XML实体,那么最好使用库函数,可能是ElementTree
,如here所述。但我想不出有什么好理由你需要这样做;如果使用库生成XML,则甚至无法使用转义字符串,因为库将逃脱转义。 {{1}}为您提供的是 ASCII(或unicode,但这与实体转义无关),您应该使用它。