【问题标题】:xml.dom.minidom: Getting CDATA valuesxml.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 '\t'.join([part_id, part_category, part_image])

【问题讨论】:

    标签: python xml


    【解决方案1】:

    p.getElementsByTagName('Category')[0].firstChild

    minidom 不会将

    所以 Category 的 firstChild 是一个 Text 节点,表示 打开标记和 CDATA 部分开始之间的空白。它有两个兄弟节点:CDATASection 节点和另一个尾随空白文本节点。

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

    p.getElementsByTagName('Category')[0].textContent
    

    但 minidom 还不支持。但是,最近的版本确实支持另一种 3 级方法,您可以使用它以更迂回的方式做同样的事情:

    p.getElementsByTagName('Category')[0].firstChild.wholeText
    

    【讨论】:

    • 零有什么用?
    • getElementsByTagName 返回一个NodeList[0] 获取列表中的第一个元素。 Python DOM 绑定要求 [n] 是 DOM .item(n) 的快捷方式。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      我遇到了类似的问题。我的解决方案与 Ironfroggy 的回答类似,但以更通用的方式实施:

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

      CDATA的节点类型为4(CDATA_SECTION_NODE

      【讨论】:

      • 你保存了我的项目,陌生人!
      猜你喜欢
      • 2010-10-15
      • 2023-04-03
      • 2014-11-22
      • 1970-01-01
      • 2021-06-15
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多