是否有用于可控XML格式的样式表或Windows命令行工具,特别是将属性设置为每行一个?

Sco*_*ord 13 xml pretty-print xml-formatting

我正在寻找一个XSLT或命令行工具(或者可以作为命令行工具的C#代码等),用于执行XML漂亮打印的Windows.具体来说,我想要一个能够将属性一对一地放置的东西,例如:

<Node>
   <ChildNode 
      value1='5'
      value2='6'
      value3='happy' />
</Node>
Run Code Online (Sandbox Code Playgroud)

它不一定非常像,但我想将它用于一个XML文件,该文件具有包含许多属性的节点,并将它们分布在多行中,使它们更易于阅读,编辑和文本差异.

注意:我认为我的首选解决方案是可以通过C#方法传递的XSLT表,尽管Windows命令行工具也很好.

Dam*_*ell 12

这是一个PowerShell脚本来完成它.它需要以下输入:

<?xml version="1.0" encoding="utf-8"?>
<Node>
    <ChildNode value1="5" value2="6" value3="happy" />
</Node>
Run Code Online (Sandbox Code Playgroud)

...并将其作为输出产生:

<?xml version="1.0" encoding="utf-8"?>
<Node>
  <ChildNode
    value1="5"
    value2="6"
    value3="happy" />
</Node>
Run Code Online (Sandbox Code Playgroud)

干得好:

param(
    [string] $inputFile = $(throw "Please enter an input file name"),
    [string] $outputFile = $(throw "Please supply an output file name")
)

$data = [xml](Get-Content $inputFile)

$xws = new-object System.Xml.XmlWriterSettings
$xws.Indent = $true
$xws.IndentChars = "  "
$xws.NewLineOnAttributes = $true

$data.Save([Xml.XmlWriter]::Create($outputFile, $xws))
Run Code Online (Sandbox Code Playgroud)

获取该脚本,将其另存为C:\ formatxml.ps1.然后,从PowerShell提示符键入以下内容:

C:\formatxml.ps1 C:\Path\To\UglyFile.xml C:\Path\To\NeatAndTidyFile.xml
Run Code Online (Sandbox Code Playgroud)

这个脚本基本上只是使用.NET框架,因此您可以非常轻松地将其迁移到C#应用程序中.

注意:如果之前未从PowerShell运行脚本,则必须在提升的PowerShell提示符下执行以下命令,然后才能执行脚本:

Set-ExecutionPolicy RemoteSigned
Run Code Online (Sandbox Code Playgroud)

你只需要这样做一次.

我希望这对你有用.


Mar*_*ell 11

这是一个小的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();
        }
    }
Run Code Online (Sandbox Code Playgroud)

样本输入:

<Node><ChildNode value1='5' value2='6' value3='happy' /></Node>
Run Code Online (Sandbox Code Playgroud)

示例输出(注意您可以删除<?xml ...with settings.OmitXmlDeclaration):

<?xml version="1.0" encoding="utf-8"?>
<Node>
  <ChildNode
    value1="5"
    value2="6"
    value3="happy" />
</Node>
Run Code Online (Sandbox Code Playgroud)

请注意,如果您想要一个字符串而不是写入文件,只需交换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();
Run Code Online (Sandbox Code Playgroud)


Ber*_*t F 5

在SourceForge上尝试整理一下。尽管它经常用在[X] HTML上,但是我之前已经在XML上成功使用过-只需确保使用该-xml选项即可。

http://tidy.sourceforge.net/#docs

Tidy读取HTML,XHTML和XML文件并编写清理的标记。...对于一般XML文件,Tidy仅限于纠正基本格式错误和漂亮的打印

人们已经移植到多个平台,并且可以作为可执行文件和可调用库使用。

Tidy有很多选择,包括:

http://api.html-tidy.org/tidy/quickref_5.0.0.html#indent

indent-attributes
页首类型:Boolean
默认值:no示例:y / n,yes / no,t / f,true / false,1/0
此选项指定Tidy是否应在新行上开始每个属性。

一个警告:

对XML的支持有限

符合W3C的XML 1.0建议的XML处理器对于将接受哪些文件非常挑剔。Tidy可以帮助您修复导致XML文件被拒绝的错误。Tidy尚未识别所有XML功能,例如,它不理解CDATA节或DTD子集。

但是我怀疑除非您的XML真正先进,否则该工具应该可以正常工作。