【问题标题】:How to get parent node attribute through child node using minidom library in python如何在python中使用minidom库通过子节点获取父节点属性
【发布时间】:2017-02-07 09:01:57
【问题描述】:

我有以下 xml 结构,我想根据每个测试用例 id 获取测试套件标记属性“名称”。

示例 xml:

<?xml version="1.0" encoding="UTF-8"?>
   <testsuite id="307849" name="Suppress Pending LOA" >
      <node_order><![CDATA[13]]></node_order>
      <details><![CDATA[]]></details> 
   <testsuite id="307850" name="Party Manager" >
      <node_order><![CDATA[0]]></node_order>
      <details><![CDATA[]]></details> 
   <testcase internalid="307851" name="Set default of “On”">
    <node_order><![CDATA[1]]></node_order>
    <externalid><![CDATA[22994]]></externalid>
    <fullexternalid><![CDATA[RLTOQA-22994]]></fullexternalid>
   </testcase>
   <testcase internalid="307858" name="Verify (LOA) workflow?&quot;">
    <node_order><![CDATA[2]]></node_order>
    <externalid><![CDATA[22995]]></externalid>
    <fullexternalid><![CDATA[RLTOQA-22995]]></fullexternalid>
   </testcase>
   </testsuite>
   <testsuite id="307871" name="Provisioning User" >
      <node_order><![CDATA[1]]></node_order>
      <details><![CDATA[]]></details> 
   <testcase internalid="307872" name="Set default of “On”">
   <node_order><![CDATA[1]]></node_order>
   <externalid><![CDATA[22998]]></externalid>
   <fullexternalid><![CDATA[RLTOQA-22998]]></fullexternalid>
   </testcase>
   <testcase internalid="307879" name="Verify Hover-over help text is?">
    <node_order><![CDATA[2]]></node_order>
    <externalid><![CDATA[22999]]></externalid>
    <fullexternalid><![CDATA[RLTOQA-22999]]></fullexternalid>
    </testcase>
    </testsuite>
    <testsuite id="307882" name="SP Portal" >
       <node_order><![CDATA[2]]></node_order>
       <details><![CDATA[]]></details> 
    <testsuite id="307883" name="Orders" >
    <node_order><![CDATA[3]]></node_order>
    <details><![CDATA[]]></details> 
    <testsuite id="307884" name="New Orders" >
       <node_order><![CDATA[2]]></node_order>
       <details><![CDATA[]]></details> 
    <testcase internalid="307885" name=" Numbers: “LOA Workflow?” is set">
    <node_order><![CDATA[100]]></node_order>
    <externalid><![CDATA[23000]]></externalid>
    <fullexternalid><![CDATA[RLTOQA-23000]]></fullexternalid>
    </testcase>
    </testsuite>
    </testsuite>
    </testsuite>
    </testsuite>

在上面的示例中,我想获取 307851 测试用例内部 ID 和父测试套件名称,即“Party Manager”,测试用例内部 ID 是 307885,并且应该返回“新订单”作为测试套件名称。因此,它需要返回直接父节点名称属性。我怎样才能做到这一点?

【问题讨论】:

    标签: python xml minidom


    【解决方案1】:

    这是一个使用 minidom 的示例。

    test_cases = doc.getElementsByTagName("testcase")
    
    for test_case in test_cases:
        if test_case.getAttribute('internalid') == '307851':
            suite_name = test_case.parentNode.getAttribute('name')
            print suite_name
            break
    

    【讨论】:

      【解决方案2】:

      您确定需要minidom吗?

      来自文档:

      尚未精通 DOM 的用户应考虑 使用 xml.etree.ElementTree 模块进行 XML 处理 而是。

      所以,minidom 似乎是不可能的。

      不幸的是,xml.etree.ElementTree 也没有从元素中获取父元素的标准工具。但是你可以迭代你的元素并在纯 python 中做任何你想做的事情,让你的 XML 像嵌套列表(元素)和字典(属性)一样简单。

      最简单的解决方案——使用lxml第三方库,它提供elem.getparent()方法和完整的XPath语言支持,可以快速找到所需的具有特定名称和属性的elem

      根据良好的官方教程尝试这些内容。 GL!

      【讨论】:

        猜你喜欢
        • 2022-07-01
        • 1970-01-01
        • 2014-06-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多