xml.dom.minidom:获取CDATA值

Jas*_*oon 12 python xml

我能够获取图像标记中的值(请参阅下面的XML),但不能获取Category标记.区别在于一个是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 '\t'.join([part_id, part_category, part_image])
Run Code Online (Sandbox Code Playgroud)

bob*_*nce 25

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

minidom不会弄平<![CDATA [部分为纯文本,它将它们留作DOM CDATASection节点.(可以说,它应该至少是可选的.DOM Level 3 LS默认为它们展平它们的价值,但minidom比DOM L3更老.)

因此,类的firstChild是一个Text节点,表示<Category>打开标记和CDATA部分开头之间的空白.它有两个兄弟:CDATASection节点和另一个尾随空白Text节点.

您可能想要的是所有类别的孩子的文本数据.在DOM Level 3 Core中你只需要调用:

p.getElementsByTagName('Category')[0].textContent
Run Code Online (Sandbox Code Playgroud)

但是minidom还不支持.但是,最新版本支持另一种Level 3方法,您可以使用它以更迂回的方式执行相同的操作:

p.getElementsByTagName('Category')[0].firstChild.wholeText
Run Code Online (Sandbox Code Playgroud)


iro*_*ggy 8

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

[n for n in category.childNodes if n.nodeType==category.CDATA_SECTION_NODE][0]
Run Code Online (Sandbox Code Playgroud)