【问题标题】:(XML) Getting an element if a node has the given value(XML) 如果节点具有给定值,则获取元素
【发布时间】:2021-08-09 16:09:21
【问题描述】:

所以我有一个 XML 文件。

<?xml version="1.0" encoding="utf-8"?>
<plist version="1.0" gjver="2.0">
    <dict>
        <k>LLM_01</k>
        <d>
            <k>_isArr</k>
            <t/>
            <k>k_0</k>
            <d>
                <k>kCEK</k>
                <i>4</i>
                <k>k18</k>
                <i>18</i>
                <k>k36</k>
                <i>40</i>
                <k>k2</k>
                <s>Run</s>
            </d>
            <k>k_1</k>
            <d>
                <k>kCEK</k>
                <i>4</i>
                <k>k18</k>
                <i>18</i>
                <k>k36</k>
                <i>40</i>
                <k>k2</k>
                <s>Run2</s>
            </d>
        </d>
        <k>LLM_02</k>
        <i>35</i>
    </dict>
</plist>

我的目标是为键“k2”获取每个值为“Run”的元素。

所以起初,我想到了某种 for 循环:

    root = ET.parse("This file.xml").getroot()
    ELEMENTS = root.find('LLM_01')
    for element in ELEMENTS:
        "some code here"

问题是,我什至不知道在“这里有一些代码”部分放什么。我正在考虑制作一个包含所有键和值的字典,如下所示:

k_0 = {'kCEK' : 4, 'k18' : 18, 'k36' : 40, 'k2' : 'Run'}
k_1 = {'kCEK' : 4, 'k18' : 18, 'k36' : 40, 'k2' : 'Run2'}

但我不知道我该怎么做。 所以我的问题是:如何检查元素内部的键“k2”是否具有值“Run”? 如果是这样,将元素放入变量中?

我知道这可能容易或困难,但我真的不知道如何做到这一点。真的需要您的帮助,如果需要,请提前致谢!

(如果您需要更多解释,请告诉我。)

【问题讨论】:

    标签: python python-3.x xml element elementtree


    【解决方案1】:

    不知道用elementtree能不能做到,但是用lxml能做到:

    from lxml import etree
    llm = """[your xml above]"""
    doc = etree.XML(llm.encode())
    
    #next line will have to modified as a function of the number of dictionaries
    d_dict = {'k_0': {},'k_1': {}}
    for d in (d_dict.items()):
        targets = doc.xpath('.//d/k[1]/following-sibling::d')
        for d,t in zip(d_dict.values(),targets):
          for k,v in zip(t.xpath('./k/text()'),t.xpath('./*[not(name()="k")]/text()')):
            d[k]=v
    d_dict
    

    输出:

    {'k_0': {'kCEK': '4', 'k18': '18', 'k36': '40', 'k2': 'Run'},
     'k_1': {'kCEK': '4', 'k18': '18', 'k36': '40', 'k2': 'Run2'}}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多