English 中文(简体)
xml.dom.minidom:获取CDATA值
原标题:
  • 时间:2009-02-27 23:20:56
  •  标签:

我能够获取图像标签中的值(请参见下面的XML),但不能获取类别标签中的值。区别在于一个是CDATA部分,另一个只是一个字符串。任何帮助将不胜感激。

from xml.dom import minidom

xml = """<?xml version="1.0" ?>
<ProductData>
    <ITEM Id="0471195">
        <Category>
            <![CDATA[Homogenizers]]>        
        </Category>
        <Image>
            0471195.jpg
        </Image>
    </ITEM>
    <ITEM Id="0471195">
        <Category>
            <![CDATA[Homogenizers]]>        
        </Category>
        <Image>
            0471196.jpg
        </Image>
    </ITEM>
</ProductData>
"""

bad_xml_item_count = 0
data = {}
xml_data = minidom.parseString(xml).getElementsByTagName( ProductData )
parts = xml_data[0].getElementsByTagName( ITEM )
for p in parts:
    try:
        part_id = p.attributes[ Id ].value.strip()
    except(KeyError):
        bad_xml_item_count += 1
        continue
    if not part_id:
        bad_xml_item_count += 1
        continue
    part_image = p.getElementsByTagName( Image )[0].firstChild.nodeValue.strip()
    part_category = p.getElementsByTagName( Category )[0].firstChild.data.strip()
    print  	 .join([part_id, part_category, part_image])
最佳回答

p.getElementsByTagName(分类)[0].firstChild

minidom不会将<![CDATA[部分扁平化为纯文本,它会将它们保留为DOM CDATASection节点。(可以说至少应该如此。DOM Level 3 LS默认将它们扁平化,但是minidom比DOM L3旧得多。)

因此,Category的第一个子节点是表示开放标记和CDATA部分开头之间的空格的Text节点。 它有两个兄弟节点:CDATASection节点和另一个尾随空格Text节点。

你可能想要的是 Category 的所有子元素的文本数据。在 DOM Level 3 Core 中,你只需调用:

p.getElementsByTagName( Category )[0].textContent

但是 minidom 目前还不支持这个。最近的版本,不过,支持另一种级别 3 的方法,您可以使用更迂回的方式来完成相同的事情:

p.getElementsByTagName(分类)[0].firstChild.wholeText
问题回答

CDATA 是自己的节点,所以这里的 Category 元素实际上有三个子节点,一个空格文本节点、CDATA 节点和另一个空格节点。你只是看错了一个,就是这样。我没有看到任何更明显的查询 CDATA 节点的方法,但是你可以像这样取出它:

[n for n in category.childNodes if n.nodeType==category.CDATA_SECTION_NODE][0]

我遇到了类似的问题。我的解决方案与ironfroggy的答案类似,但实现得更加通用:

for node in parentNode.childNodes:
        if node.nodeType == 4:
            cdataContent = node.data.strip()

CDATA节点类型为4(CDATA_SECTION_NODE





相关问题
热门标签