Python 对XML文件排序
是否可以按如下方式对XML文件进行排序:Python 对XML文件排序,python,xml,xslt,sorting,xpath,Python,Xml,Xslt,Sorting,Xpath,是否可以按如下方式对XML文件进行排序: <model name="ford"> <driver>Bob</driver> <driver>Alice</driver> </model> <model name="audi"> <driver>Carly</driver> <driver>Dean</driver> </model> 上下快速移动
<model name="ford">
<driver>Bob</driver>
<driver>Alice</driver>
</model>
<model name="audi">
<driver>Carly</driver>
<driver>Dean</driver>
</model>
上下快速移动
爱丽丝
卡莉
院长
那会变成什么
<model name="audi">
<driver>Carly</driver>
<driver>Dean</driver>
</model>
<model name="ford">
<driver>Alice</driver>
<driver>Bob</driver>
</model>
卡莉
院长
爱丽丝
上下快速移动
也就是说,最外面的元素先排序,然后是第二个最外面的元素,依此类推
它们首先需要按元素名排序。这能做到吗?或者我应该使用类似BeautifulSoup的东西来实现我自己的功能吗?试试这个XSLT:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" />
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()">
<xsl:sort select="text() | @*"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
尝试以下XSLT:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" />
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()">
<xsl:sort select="text() | @*"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
您不需要对整个xml dom进行排序。 而是将所需的节点放入一个列表中并对它们进行排序。因为我们在处理时需要排序顺序,而不是在文件中,所以最好在运行时完成。 可能是这样,使用minidom 导入操作系统,系统 从xml.dom导入minidom document=”“”\ 上下快速移动 爱丽丝 卡莉 院长 """ document=minidom.parseString(文档) elements=document.getElementsByTagName(“模型”) elements.sort(key=lambda元素:elements.attributes['name'])
您不需要对整个xml dom进行排序。 而是将所需的节点放入一个列表中并对它们进行排序。因为我们在处理时需要排序顺序,而不是在文件中,所以最好在运行时完成。 可能是这样,使用minidom 导入操作系统,系统 从xml.dom导入minidom document=”“”\ 上下快速移动 爱丽丝 卡莉 院长 """ document=minidom.parseString(文档) elements=document.getElementsByTagName(“模型”) elements.sort(key=lambda元素:elements.attributes['name'])
这是对Kirill解决方案的改进,我认为它更好地反映了所述的需求,并且避免了如果排序键包含多个值(但仍适用于1.0),XSLT 2.0将给您带来的类型错误
这是对Kirill解决方案的改进,我认为它更好地反映了所述的需求,并且避免了如果排序键包含多个值(但仍适用于1.0),XSLT 2.0将给您带来的类型错误
您可以通过将节点从父节点中删除,然后按预定顺序重新插入节点来对节点进行排序。例如:
def sort_tree(tree):
""" recursively sorts the given etree in place """
for child in tree:
sort_tree(child)
sorted_children = sorted(tree, key=lambda n: n.text)
for child in tree:
tree.remove(child)
for child in reversed(sorted_children):
tree.insert(0, child)
tree = etree.fromstring(YOUR_XML)
sort_tree(tree)
print(etree.tostring(tree, pretty_print=True))
可以通过将节点从父节点中删除,然后按预期顺序重新插入节点来对节点进行排序。例如:
def sort_tree(tree):
""" recursively sorts the given etree in place """
for child in tree:
sort_tree(child)
sorted_children = sorted(tree, key=lambda n: n.text)
for child in tree:
tree.remove(child)
for child in reversed(sorted_children):
tree.insert(0, child)
tree = etree.fromstring(YOUR_XML)
sort_tree(tree)
print(etree.tostring(tree, pretty_print=True))
将结构读入对象列表,对其进行排序,然后将其写回任意位置。就这么简单。我不认为这里的人会为你写代码。我希望有什么东西已经可以做到这一点。对xml进行排序没有意义,但可以使用xslt对其进行转换。回答你的问题,是的,这是可能的。可以这样做:)
提示:
使用lxml或ElementTreeXML只是一个数据结构。有太多的排序函数,如.sort()
将结构读入对象列表,对其进行排序,然后将其写回任何需要的位置。就这么简单。我不认为这里的人会为你写代码。我希望有什么东西已经可以做到这一点。对xml进行排序没有意义,但可以使用xslt对其进行转换。回答你的问题,是的,这是可能的。可以这样做:)提示:
使用lxml或ElementTreeXML只是一个数据结构。有过多的排序函数,如.sort()
,它可以工作,但只是偶然发生的,而且看起来比它更通用。例如,它只起作用,因为具有子元素的元素只有一个属性。它起作用,但只是偶然发生的,而且看起来比它更一般。例如,它只起作用,因为具有子元素的元素只有一个属性。嗨,xslt中是否有输入错误:需要是起始标记,而不是完整标记(匹配的结束标记在文件中较低的两行)嗨,xslt中是否有输入错误:需要是起始标记,而不是完整标记(匹配的结束标记在文件中较低两行)我对这个解决方案印象深刻。我必须更改它以适应新的Python3行为并添加额外的排序轴:sorted\u children=sorted(tree,key=lambda n:n.get('name',n.get('text',n.get('value','')).lower()
。我对这个解决方案印象深刻。我必须改变它以适应新的Python3行为并添加额外的排序轴:sorted\u children=sorted(tree,key=lambda n:n.get('name',n.get('text',n.get('value','')。lower())
。