ElementTree - 按名称而不是索引引用xml节点

时间:2017-11-04 22:50:32

标签: xml python-3.x elementtree

对于下面的xml示例(不是实际的xml只是指示性的),对于我尝试的每个<field>记录: 打印出ref标记的title标记和genre属性的field属性,但仅打印ref title属性的12, thriller属性tag等于12.对于这个xml,它将打印出来:

<?xml version="1.0" encoding="utf-8" ?> <record> <field genre='comedy'> <title ref='123'>Title1</title> <author>Author1</author> <example>xml - valid xml file</example> </field> <field genre='comedy'> <title ref='123'>Title1</title> <author>Author2</author> <example>xml - valid xml file</example> </field> <field genre='thriller'> <title ref='12'>Title</title> <author>Author3</author> <example>xml - valid xml file</example> </field> </record>

child[0]

使用Element Tree 20.5 documentation我已经能够使用索引完成此操作,例如引用field而不是import xml.etree.ElementTree as ET tree = ET.parse('test.xml') root = tree.getroot() for child in root: if 'ref' in child[0].attrib: x = child[0].get('ref') if x == '12': y = child.get('genre') print(x, y) 代码:

child[0]

虽然这确实有效,但如果由于某种原因在位置public static function getUpperCase($str) { preg_match_all('/\b[A-Z][a-zA-Z]*(\s+[A-Z][a-zA-Z]*)*\b/', $str, $matches); return $matches[0]; } 的xml中有一个额外的元素,它将无法按要求工作。

我如何通过名称而不是索引来引用它?

1 个答案:

答案 0 :(得分:1)

您可以使用find('title')代替child[0]在父title内找到名为<field>的子元素:

for child in root:
    title = child.find('title')
    if 'ref' in title.attrib:
        x = title.get('ref')
        if x == '12':
            y = child.get('genre')
            print(x, y)

快速测试:https://eval.in/893148