【问题标题】:sort XML tags into alphabetical order将 XML 标记按字母顺序排序
【发布时间】:2012-02-06 14:49:42
【问题描述】:

有谁知道我可以将 XML 文件加载到其中并对其进行排序然后保存文件的方法吗?

我有一个包含一堆设置的 xml 文件。现在它变得越来越难以管理,因为它们没有任何自然的排序顺序......

例如

<edit_screen_a>
<settings_font_size>
<edit_screen_b>
<display_screen>
<settings_font_name>

排序到:

<display_screen>
<edit_screen_a>
<edit_screen_b>
<settings_font_name>
<settings_font_size>

【问题讨论】:

  • 您使用的是什么操作系统?您更喜欢使用哪种语言/库?
  • OS X... 使用 Eclipse... 发现下面的接受的答案非常适合我的需求

标签: xml


【解决方案1】:

您可以使用 XSLT 并从命令行运行它。 (我推荐Saxon,但Xalan 也可以。)

这是一个例子......

XML 输入

<doc>
  <edit_screen_a/>
  <settings_font_size/>
  <edit_screen_b/>
  <display_screen/>
  <settings_font_name/>
</doc>

XSLT 1.0

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="doc">
    <doc>
      <xsl:apply-templates>
        <xsl:sort select="name()"/>
      </xsl:apply-templates>      
    </doc>
  </xsl:template>

</xsl:stylesheet>

XML 输出

<doc>
   <display_screen/>
   <edit_screen_a/>
   <edit_screen_b/>
   <settings_font_name/>
   <settings_font_size/>
</doc>

【讨论】:

  • 效果惊人!我将此 xsl 文件放入 Eclipse 中,然后按“运行”并选择我的源 xml,瞧……几乎完美……只需在 Eclipse 中选择“格式”即可很好地缩进再次...谢谢,这确实是解决这个问题的好方法
  • 我的记忆(这不是最好的)似乎同意我的评论,即它以前对我来说很好......但现在它似乎没有那么好......也许这是因为我在这个 xml 源文件中添加了一些 XSLT 文件不喜欢的东西......我经常更新源文件,因为它是我的程序用于本地化的字符串集合。知道什么样的事情会导致此 XSLT 文件无法正确排序吗?
  • @ycomp - 如果没有没有正确排序的例子,很难说。如果您用更新的示例更新问题,我可以看看。
  • 没关系,我只是想知道你是否有什么不知道的事情......
  • 对于多级 xml 文件我也会有同样的问题 --> 请参阅 stackoverflow.com/questions/30923547/…
【解决方案2】:

如果接受的答案给您带来问题,请考虑:

sort.xslt

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <!-- for well formatted output -->
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="*">
        <!-- copy this node (but this does not copy the attributes ...) -->
        <xsl:copy>
            <!-- so, copy the attributes as well -->
            <xsl:copy-of select="@*"/>
            <!-- recurse on sorted (by tag name) list of child nodes -->
            <xsl:apply-templates>
                <xsl:sort select="name()"/>
            </xsl:apply-templates>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

(Reference documentation on XSLT包括上面用到的各种操作可以在MDN上找到)

https://stackoverflow.com/a/9165464/5412249相比

  • 不假定任何特定的根节点
  • 同时保留属性
  • 使用单一模板(恕我直言,更容易理解)

要实际应用此功能,在 Mac 上(可能也在 linux 系统上),您可以使用 xsltproc

xsltproc sort.xslt test.xml

其中,test.xml 是任意 xml 文件

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-08
    • 2011-01-30
    • 2019-04-05
    • 2012-04-08
    • 2022-01-06
    相关资源
    最近更新 更多