我能够获取图像标记中的值(请参阅下面的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)
CDATA是它自己的节点,因此这里的Category元素实际上有三个子节点,一个空白文本节点,CDATA节点和另一个空白节点.你只是看错了,就是这样.我没有看到任何更明显的方法来查询CDATA节点,但你可以像这样把它拉出来:
[n for n in category.childNodes if n.nodeType==category.CDATA_SECTION_NODE][0]
Run Code Online (Sandbox Code Playgroud)