我正在寻找一种XSLT或命令行工具(或者可以变成命令行工具的C#代码,等等),它们可以很好地打印XML。具体地说,我想要一个能够将属性一对一地放入一行的程序,例如:
<Node>
<ChildNode
value1='5'
value2='6'
value3='happy' />
</Node>
它不一定要完全像这样,但我想将它用于一个XML文件,该文件包含具有数十个属性的节点,并且将它们分布在多行中可以使它们更易于阅读、编辑和文本比较。
注意:我认为我首选的解决方案是可以通过C#方法传递的XSLT工作表,尽管Windows命令行工具也很好用。
发布于 2010-04-18 17:46:12
下面是一个小的C#示例,它可以由您的代码直接使用,也可以内置到可执行文件中,并在命令行中以“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>
示例输出(请注意,您可以使用settings.OmitXmlDeclaration
删除<?xml ...
):
<?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();
发布于 2010-04-18 23:34:30
这里有一个PowerShell脚本来完成这项工作。它接受以下输入:
<?xml version="1.0" encoding="utf-8"?>
<Node>
<ChildNode value1="5" value2="6" value3="happy" />
</Node>
...and将生成以下内容作为输出:
<?xml version="1.0" encoding="utf-8"?>
<Node>
<ChildNode
value1="5"
value2="6"
value3="happy" />
</Node>
这就是了:
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))
获取该脚本,将其保存为C:\formatxml.ps1。然后,在PowerShell提示符下键入以下内容:
C:\formatxml.ps1 C:\Path\To\UglyFile.xml C:\Path\To\NeatAndTidyFile.xml
这个脚本基本上只是使用.NET框架,所以您可以很容易地将其移植到C#应用程序中。
注意:如果您以前没有从PowerShell运行过脚本,则必须在提升的PowerShell提示符下执行以下命令,然后才能执行脚本:
Set-ExecutionPolicy RemoteSigned
不过,您只需这样做一次。
我希望这对你有用。
发布于 2010-04-18 00:43:29
在SourceForge上尝试使用Tidy。尽管它经常用于XHTML语言,但我以前也成功地在XML语言中使用过它--只要确保使用-xml
选项即可。
http://tidy.sourceforge.net/#docs
XHTML读取
、XHTML和XML文件,并编写经过清理的标记。..。对于一般的XML文件,Tidy仅限于纠正基本的格式良好性错误和美观的打印。
人们已经移植到了几个平台上,它可以作为可执行和可调用的库使用。
Tidy有一堆options,包括:
http://api.html-tidy.org/tidy/quickref_5.0.0.html#indent
缩进-属性
Top Type: Boolean
默认值:无示例: y/n,yes/ no,t/f,true/false,1/0
此选项指定Tidy是否应从新行开始每个属性。
需要注意的是:
对XML的有限支持
符合W3C的XML1.0推荐标准的XML处理程序对接受哪些文件非常挑剔。Tidy可以帮助您修复导致XML文件被拒绝的错误。Tidy还不能识别所有的XML特性,例如,它不能识别CDATA部分或DTD子集。
但我怀疑,除非您的XML非常高级,否则该工具应该可以很好地工作。
https://stackoverflow.com/questions/2568310
复制相似问题