如何在 Python 中使用 etree 按嵌套的子元素文本值对 xml 进行排序

细枝末节

我已经多次看到这个问题的变体(在 python etree中对 XML 进行排序,使用 etree 对 xml 值进行排序)但似乎无法使这些答案适应我的问题。我正在尝试按特定的子元素标签对导入的 xml 文件进行排序,在这种情况下它是按“id”标签。以下是有问题的xml:

输入:

    <bookstore Location="New York">              
        <Genre type="Fiction">
            <name>Fiction</name>
            <id>4</id>
            <pages>300</pages>
            </Genre>
        <Genre type="Fiction">
            <name>Fictional Fiction</name>
            <id>2</id>
            <pages>500</pages>
        </Genre>
        <Genre type="Horror">
            <name>Horrors</name>
            <id>1</id>
            <pages>450</pages>
        </Genre>
        <Genre type="Horror">
            <name>Horrendous Horror</name>
            <id>3</id>
            <pages>20</pages>
        </Genre>
        <Genre type="Comedy">
            <name>Comedic Comedy</name>
            <id>0</id>
            <pages>1</pages>
        </Genre>
    </bookstore>

我想通过他们的子元素“id”来组织所有的流派元素。这是我要的输出:

输出:

    <bookstore Location="New York">              
        <Genre type="Comedy">
            <name>Comedic Comedy</name>
            <id>0</id>
            <pages>1</pages>
        </Genre>
        <Genre type="Horror">
            <name>Horrors</name>
            <id>1</id>
            <pages>450</pages>
        </Genre>
        <Genre type="Fiction">
            <name>Fictional Fiction</name>
            <id>2</id>
            <pages>500</pages>
        </Genre>
        <Genre type="Horror">
            <name>Horrendous Horror</name>
            <id>3</id>
            <pages>20</pages>
        </Genre> 
        <Genre type="Fiction">
            <name>Fiction</name>
            <id>4</id>
            <pages>300</pages>
        </Genre>
    </bookstore>

这是我尝试过的代码:

    def sortchildrenby(parent):
    parent[:] = sorted(parent, key=lambda child: child.tag == 'id')

    filename = "Example.xml"
    tree = ET.parse(filename)
    root = tree.getroot()                      
    attr = "type"
    for elements in root:
        sortchildrenby(elements)
    tree.write("exampleORGANIZED.xml")

这导致以下xml:

    <bookstore Location="New York">              
        <Genre type="Fiction">
            <name>Fiction</name>
            <pages>300</pages>
            <id>4</id>
            </Genre>
        <Genre type="Fiction">
            <name>Fictional Fiction</name>
            <pages>500</pages>
        <id>2</id>
            </Genre>
        <Genre type="Horror">
            <name>Horrors</name>
            <pages>450</pages>
        <id>1</id>
            </Genre>
        <Genre type="Horror">
            <name>Horrendous Horror</name>
            <pages>20</pages>
        <id>3</id>
            </Genre>
        <Genre type="Comedy">
            <name>Comedic Comedy</name>
            <pages>1</pages>
        <id>0</id>
            </Genre>
    </bookstore>

ID 向下移动并且没有按升序重新排序。

完美的

将整个根传递给方法而无需迭代,因为您需要对底层<Genre>元素进行排序,而不是对每个单独的元素进行排序。此外,调整方法以按元素文本而不是布尔表达式排序:

def sortchildrenby(parent, attr):
    parent[:] = sorted(parent, key=lambda child: child.find(attr).text)

tree = ET.parse("Input.xml")
root = tree.getroot()
                    
sortchildrenby(root, "id")
    
ET.indent(tree, space="\t", level=0)   # PRETTY PRINT (ADDED Python 3.9)
tree.write("Output.xml")

输出

<bookstore Location="New York">
    <Genre type="Comedy">
        <name>Comedic Comedy</name>
        <id>0</id>
        <pages>1</pages>
    </Genre>
    <Genre type="Horror">
        <name>Horrors</name>
        <id>1</id>
        <pages>450</pages>
    </Genre>
    <Genre type="Fiction">
        <name>Fictional Fiction</name>
        <id>2</id>
        <pages>500</pages>
    </Genre>
    <Genre type="Horror">
        <name>Horrendous Horror</name>
        <id>3</id>
        <pages>20</pages>
    </Genre>
    <Genre type="Fiction">
        <name>Fiction</name>
        <id>4</id>
        <pages>300</pages>
    </Genre>
</bookstore>

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用python etree中的值对XML进行排序

在python etree中对XML进行排序

xml.etree.ElementTree >> Python >>如何访问子元素并进行断言

在Python中使用etree解析XML

使用 Python xml.etree.ElementTree 从 xml 文件中按名称获取元素值

在python中使用xml.etree解析XML抛出TypeError

如何使用带有 lxml 和 python 的预先存在的 etree 元素创建 xml 文档?

如何使用Python etree lxml xpath设置/替换xml中的值?

Python XML etree - 如何读取值中的节点值?

如何在Python中使用Lambda进行排序

如何使用xml.etree.ElementTree访问标签之间的文本

如何使用etree.Element从xml条目中插入文本

使用 xmldom 或 etree 使用 python 解析 XML

使用python etree从xml中删除模式

如何在 python 中使用 ElementTree 获取元素的 xml:id

使用xml.etree.ElementTree更改xml元素文本

如何使用python按值对json进行整数排序

如何使用项目的子值对嵌套的python字典进行排序

使用Etree从XML中删除特定元素

在Python中使用xml.etree.Elementree检索具有至少两个特定类型的子元素的所有元素

如果使用 xml.etree.ElementTree 有标签值,则 Python xml 读取

如何根据索引使用python etree访问特定元素

Python 3如何在xml.etree.ElementTree的子节点中搜索列表中的字符串

如何在JQuery中按日期对xml数据进行排序

如何在Windows中使用Python子进程进行搜索

如何在Windows中使用Python子进程进行搜索

使用Python和xml.etree解析XML

使用Python xml.etree解析xml文件:空结果

使用 Python xml.etree.ElementTree 遍历 XML 树的问题