Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 对XML文件排序_Python_Xml_Xslt_Sorting_Xpath - Fatal编程技术网

Python 对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> 上下快速移动

是否可以按如下方式对XML文件进行排序:

<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())