我正在寻找一个xslt或命令行工具(或可以生成命令行工具的c代码,等等)用于windows,它可以很好地打印xml。具体来说,我想要一个能够把属性一对一地放在一行的人,比如:

<Node>
   <ChildNode
      value1='5'
      value2='6'
      value3='happy' />
</Node>

它不必完全像那样,但我想将它用于一个xml文件,该文件的节点具有数十个属性,并将它们跨多行分布,使它们更易于读取、编辑和文本区分。
注意:我认为我的首选解决方案是一个xslt工作表,我可以通过一个c方法,尽管windows命令行工具也很好。

最佳答案

下面是一个小的c示例,可以直接由代码使用,也可以内置到exe中,并在命令行中调用为“myexe from.xml to.xml”:

    using System.Xml;

    static void Main(string[] args)
    {
        XmlWriterSettings settings = new XmlWriterSettings {
            NewLineHandling = NewLineHandling.Entitize,
            NewLineOnAttributes = true, Indent = true, IndentChars = "  ",
            NewLineChars = Environment.NewLine
        };

        using (XmlReader reader = XmlReader.Create(args[0]))
        using (XmlWriter writer = XmlWriter.Create(args[1], settings)) {
            writer.WriteNode(reader, false);
            writer.Close();
        }
    }

样本输入:
<Node><ChildNode value1='5' value2='6' value3='happy' /></Node>

示例输出(注意,您可以用<?xml ...删除settings.OmitXmlDeclaration):
<?xml version="1.0" encoding="utf-8"?>
<Node>
  <ChildNode
    value1="5"
    value2="6"
    value3="happy" />
</Node>

注意,如果您想要字符串而不是写入文件,只需与StringBuilder交换即可:
StringBuilder sb = new StringBuilder();
using (XmlReader reader = XmlReader.Create(new StringReader(oldXml)))
using (XmlWriter writer = XmlWriter.Create(sb, settings)) {
    writer.WriteNode(reader, false);
    writer.Close();
}
string newXml = sb.ToString();

10-07 23:57