当XML具有特殊字符时,使用Python minidom进行XML解析

时间:2013-09-25 19:49:04

标签: python xml xml-parsing minidom

我有一个XML文件,需要将“TAB”字符作为键的值。基于此链接Represent space and tab in XML tag我将其编码为&#009而不是使用“\ t”,因为它将其解释为包含两个字符'\'和't'的字符串。

我没有使用CDATA部分,因为它仍会将TAB视为包含两个字符'\'和't'的字符串

我的用例的示例XML文件看起来像这样

<?xml version="1.0" encoding="UTF-8"?>
<keys>
    <key>
        <name>key1</name>
        <value>value1</value>
    </key>
    <key>
        <name>key2</name>
        <value>&#009;</value>                                                                    
    </key>
    <key>
        <name>key3</name>
        <value>2048</value>
    </key>
</keys>

这是我现在无法处理此TAB字符的代码

...
dom_obj = minidom.parse(self.path_to_xml)
...
for each_key_child in key_child:
    if each_key_child.nodeType == Node.ELEMENT_NODE:
        if each_key_child.nodeName == 'name':
            node_name = str(each_key_child.childNodes[0].data.strip())
        elif each_key_child.nodeName == 'value':
            node_value = str(each_key_child.childNodes[0].data.strip())
        else:
            pass
    else:
        pass

执行脚本后得到的输出是

'key1': 'value1',
'key2': '',
'key3': '2048',

但是当我在Python交互式解释器上执行它时

mobj = minidom.parse(path_to_xml_file)
mobj.getElementsByTagName("value")[1].childNodes[0]

我得到以下输出

<DOM Text node "u'\t'">

但是我无法将输出分配给变量。此步骤无效

node = mobj.getElementsByTagName("value")[1].childNodes[0].data

但另一个奇怪的事情是,当我在解释器上说节点时,它正在打印'\ t'!!

node
u'\t'

要查看这是否是TAB字符存储在变量中但未显示的真实情况,我将其用作连接器以连接两个字符串。

这在解释器上运行正常,但在脚本中我没有通过:set list选项在vim上看到的输出

有谁能告诉我这种方法有什么问题。帮助赞赏!

1 个答案:

答案 0 :(得分:3)

您正在呼叫strip()。这剥离标签。只是不要这样做。 (或者,如果您需要删除空格或换行符或特定内容,但留下标签,请使用特定参数调用它,例如strip('\n')。)

这是一个演示(伪造,因为你的示例XML无效,所以我无法测试它):

>>> mobj.getElementsByTagName("value")[1].childNodes[0]
<DOM Text node "u'\t'">
>>> mobj.getElementsByTagName("value")[1].childNodes[0].data
u'\t'
>>> mobj.getElementsByTagName("value")[1].childNodes[0].data.strip()
u''
>>> mobj.getElementsByTagName("value")[1].childNodes[0].data.strip('\n')
u'\t'