能否按XML属性gid排序?求实现工具及合并去重方案
按gid排序XML中节点的实现方案及工具
完全可以实现,下面分工具和具体操作方式说明:
一、命令行工具(快速批量处理)
1. xmlstarlet(推荐,轻量易用)
这是专门处理XML的命令行工具,一行命令就能完成按gid排序<root>,所有<e>节点直接在<root>下,命令如下:
xmlstarlet ed --sort "@gid" -L input.xml
--sort "@gid":指定按<e>节点的gid属性排序-L:直接修改原文件(若不想修改原文件,去掉-L并输出到新文件:xmlstarlet ed --sort "@gid" input.xml > sorted_input.xml)
如果<e>节点有特定父节点(比如<entries>),调整路径即可:
xmlstarlet ed --sort "/entries/e/@gid" -L input.xml
2. XSLT + xsltproc(灵活定制)
适合需要自定义排序规则的场景,先写一个XSLT样式表:
创建sorter.xsl:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes"/> <!-- 复制所有节点结构 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- 对<e>节点按gid升序排序 --> <xsl:template match="/*"> <xsl:copy> <xsl:apply-templates select="@*"/> <xsl:apply-templates select="e"> <xsl:sort select="@gid" data-type="text" order="ascending"/> </xsl:apply-templates> </xsl:template> </xsl:stylesheet>
然后用xsltproc执行转换:
xsltproc sorter.xsl input.xml > sorted_input.xml
二、脚本实现(高度定制化)
Python + lxml(适合自动化合并流程)
如果需要和后续的冗余合并逻辑结合,用Python脚本更灵活:
from lxml import etree # 加载XML文件 tree = etree.parse("input.xml") root = tree.getroot() # 定位所有<e>节点,按gid属性排序 e_nodes = root.xpath("//e") e_nodes_sorted = sorted(e_nodes, key=lambda x: x.get("gid")) # 清空原节点,重新添加排序后的节点 for parent in set(e.getparent() for e in e_nodes): # 移除原节点 for e in e_nodes: parent.remove(e) # 添加排序后的节点 for e in e_nodes_sorted: parent.append(e) # 保存排序后的XML tree.write("sorted_input.xml", encoding="utf-8", pretty_print=True)
三、后续合并冗余的建议
排序完成后,可通过以下方式合并多份文件的变更:
- 可视化对比:用
meld、kdiff3打开多份排序后的XML,按gid匹配节点,手动合并变更 - 命令行对比+自动合并:用
xmlstarlet diff file1.xml file2.xml生成差异报告,再编写脚本自动合并(比如保留每个gid对应节点的最新版本,或合并不同属性)
内容的提问来源于stack exchange,提问作者Vikram
相关产品推荐
相关产品推荐

