【问题标题】:Specific pathing to find XML elements using minidom in Python在 Python 中使用 minidom 查找 XML 元素的特定路径
【发布时间】:2014-01-14 21:05:17
【问题描述】:

根据this thread,我正在使用xml.dom.minidom 进行一些非常基本的XML 遍历,只读。

让我感到困惑的是,为什么它的getElementsByTagName 会在没有明确提供确切路径的情况下找到几个层次结构级别的节点。

XML:

<data>
    <items>
        <item name="item1"></item>
        <item name="item2"></item>
        <item name="item3"></item>
        <item name="item4"></item>
    </items>
    <secondSetOfItems>
        <item name="item5"></item>
        <item name="item6"></item>
        <item name="item7"></item>
        <item name="item8"></item>
    </secondSetOfItems>
</data>

Python 代码:

xmldoc = minidom.parse('sampleXML.xml')
items = xmldoc.getElementsByTagName('item') 

for item in items:
    print item.attributes['name'].value

打印:

item1
item2
item3
item4
item5
item6
item7
item8

困扰我的是它隐式地在data-&gt;itemsdata-&gt;secondSetOfItems 下找到名为item 的标签。

如何使其遵循明确的路径并仅提取两个类别之一下的项目?例如。 data-&gt;secondSetOfItems下:

item5
item6
item7
item8

【问题讨论】:

    标签: python xml dom


    【解决方案1】:

    如果您想从特定类别中获取项目,您可以先抓取父元素。

    例如:

    代码

    xmldoc = minidom.parse('sampleXML.xml')
    #Grab the first occurence of the "secondSetOfItems" element
    second_items = xmldoc.getElementsByTagName("secondSetOfItems")[0]
    item_list = second_items.getElementsByTagName("item")
    
    for item in item_list:
        print item.attributes['name'].value
    

    输出

    item5
    item6
    item7
    item8
    

    【讨论】:

    • 非常感谢。还有一个问题:假设我在项目标签&lt;item name="item8"&gt;XYZ&lt;/item&gt; 中有一个值。我将如何阅读 XYZ ?我试过item.nodeValue 无济于事
    • nvrmnd,应该是item.childNodes[0].nodeValue
    【解决方案2】:

    这是getElementsByTagName的声明行为

    搜索具有特定元素类型名称的所有后代(直接子代、子代的子代等)。

    有人在上面写了一个“过滤器”,见this answer

    在我看来minidom太简单了,考虑使用lxml xpath:

    tree.xpath('//secondSetOfItems/item/@name')
    

    BeautifulSoupfindAll:

    data.secondSetOfItems.item.findAll('name')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-12
      • 1970-01-01
      • 2021-11-13
      • 1970-01-01
      • 2013-05-01
      相关资源
      最近更新 更多