XML排序/格式化工具

And*_*ich 15 xml formatting

是否有任何工具可以(漂亮地打印)格式化XML文件以及对其元素和属性进行排序?

Aki*_*oto 14

我喜欢这个工具:https://xmlsorter.codeplex.com/

您可以按标签名称和属性进行排序.我喜欢在比较一些XML文件之前使用它.

XML Sorter主窗口

  • 看来 CodePlex 即将关闭,页面仍在 webarchive 上,但项目存档未链接到该页面,因此这是 webarchive 中项目存档的链接 https://web.archive.org/web/20210309105113/https: //codeplexarchive.blob.core.windows.net/archive/projects/XmlSorter/XmlSorter.zip (2认同)

was*_*ard 8

我正在寻找一个类似的实用程序,并没有找到我想要的东西,所以我只是差不多写了一个.它非常简单(并且不包括节点排序中的属性),但有效.

也许它对别人有用..它在GitHub上.

这里有一点来自GitHub页面......

USAGE: sortxml.exe [options] infile [outfile]

  infile      The name of the file to sort, etc.
  outfile     The name of the file to save the output to.
              If this is omitted, then the output is written to stdout.

OPTIONS:

  --pretty    Ignores the input formatting and makes the output look nice.
  --sort      Sort both the nodes and attributes.
  --sortnode  Sort the nodes.
  --sortattr  Sort the attributes.

(prefix an option with ! to turn it off.)
Run Code Online (Sandbox Code Playgroud)

默认设置是输出漂亮且已排序的节点和属性.这是一个例子:

> type sample.xml
<?xml version="1.0" encoding="utf-8" ?><root><node value="one" attr="name"/></root>

> sortxml.exe sample.xml
<?xml version="1.0" encoding="utf-8"?>
<root>
  <node attr="name" value="one" />
</root>
Run Code Online (Sandbox Code Playgroud)


Yah*_*ous 7

出于对 Visual Studio 似乎一直在重新排序和重写 EDMX 文件(实体框架)的失望(另请参阅此Uservoice),我编写了一些 Linqpad 代码来重新排序内容。然而,在 LinqPad 之外使用它很容易(而且很明显)。

它通过元素类型(标签)对元素进行排序,然后通过元素属性“名称”的值,然后通过其他一些东西来尝试使其具有确定性(不同的 xml,但相同的含义,[通常是] 相同的输出 - 见代码)。

它还对属性进行排序。请注意,语义上的XML 属性可能没有(相关的)顺序,但在文本上它们确实如此,并且版本控制系统仍将它们视为纯文本......

(请注意,它不修复不同的别名,在Entity Framework edmx 文件中提到的不同的别名在团队中以不同的方式重新生成

void Main()
{
    XDocument xdoc = XDocument.Load(@"\\filepath1\file1.edmx");

    var orderedElements = CopyAndSortElements(xdoc.Elements());

    var newDoc = new XDocument();
    newDoc.Add(orderedElements);
    newDoc.Save(@"\\filepath1\file1.Ordered.edmx");
}

public IEnumerable<XElement> CopyAndSortElements(IEnumerable<XElement> elements)
{
    var newElements = new List<XElement>();
    // Sort XElements by Tag & name-attribute (and some other properties)
    var orderedElements = elements.OrderBy(elem => elem.Name.LocalName) // element-tag
                                  .ThenByDescending(elem => elem.Attributes("Name").Count()) // can be 0, more than 1 is invalid XML
                                  .ThenBy(elem => (elem.Attributes("Name").Any() ? elem.Attributes("Name").First().Value.ToString() : string.Empty))
                                   // in case of no Name-Attributes, try to sort by (number of) children
                                  .ThenBy(elem => elem.Elements().Count())
                                  .ThenBy(elem => elem.Attributes().Count())
                                  // next line may vary for textually different but semantically equal input when elem & attr were unordered on input, but I need to restrain myself...
                                  .ThenBy(elem => elem.ToString());
    foreach (var oldElement in orderedElements)
    {
        var newElement = new XElement(oldElement.Name);
        if (oldElement.HasElements == false && string.IsNullOrEmpty(oldElement.Value) == false)
        {
            // (EDMX does not have textual nodes, but SO-users may use it for other XML-types ;-) )
            // IsNullOrEmpty-check: not setting empty value keeps empty-element tag, setting value (even empty) causes start-tag immediately followed by an end-tag
            // (empty-element tags may be a matter of taste, but for textual comparison it will matter!)
            newElement.Value = oldElement.Value;
        }
        var orderedAttrs = oldElement.Attributes().OrderBy(attr => attr.Name.LocalName).ThenBy(attr => attr.Value.ToString());
        newElement.Add(orderedAttrs);
        newElement.Add(CopyAndSortElements(oldElement.Elements()));
        newElements.Add(newElement);
    }
    return newElements;
}
Run Code Online (Sandbox Code Playgroud)

PS:我们最终使用了其他人同时编写的 XSLT。我认为它在每个人的构建过程中都更容易/更好。但也许/希望这对某人有用。


And*_*ich 5

我找到了这篇文章:http://www.biglist.com/lists/xsl-list/archives/200106/msg01225.html,它使用以下 XSLT 来缩进 XML 并对属性进行排序:

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

  <xsl:output method="xml" indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="/">
    <xsl:apply-templates/>
  </xsl:template>

  <xsl:template match="*">
    <xsl:copy>
      <!-- Sort the attributes by name. -->
      <xsl:for-each select="@*">
        <xsl:sort select="name( . )"/>
        <xsl:copy/>
      </xsl:for-each>
      <xsl:apply-templates/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="text()|comment()|processing-instruction()">
    <xsl:copy/>
  </xsl:template>

</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)

我还没有尝试过,但很可能我会坚持使用 XSLT 来为我进行格式化。