我已经多次看到这个问题的变体(在 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] 删除。
我来说两句