首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否有样式表或Windows命令行工具可用于可控的XML格式化,特别是每行放置一个属性?

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

Stack Overflow用户
提问于 2010-04-03 02:05:13
回答 7查看 7.2K关注 0票数 14

我正在寻找一种XSLT或命令行工具(或者可以变成命令行工具的C#代码,等等),它们可以很好地打印XML。具体地说,我想要一个能够将属性一对一地放入一行的程序,例如:

代码语言:javascript
运行
复制
<Node>
   <ChildNode 
      value1='5'
      value2='6'
      value3='happy' />
</Node>

它不一定要完全像这样,但我想将它用于一个XML文件,该文件包含具有数十个属性的节点,并且将它们分布在多行中可以使它们更易于阅读、编辑和文本比较。

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

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2010-04-18 17:46:12

下面是一个小的C#示例,它可以由您的代码直接使用,也可以内置到可执行文件中,并在命令行中以“myexe from.xml to.xml”的形式调用:

代码语言:javascript
运行
复制
    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();
        }
    }

示例输入:

代码语言:javascript
运行
复制
<Node><ChildNode value1='5' value2='6' value3='happy' /></Node>

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

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="utf-8"?>
<Node>
  <ChildNode
    value1="5"
    value2="6"
    value3="happy" />
</Node>

请注意,如果您需要字符串而不是写入文件,则只需使用StringBuilder进行交换

代码语言:javascript
运行
复制
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();
票数 11
EN

Stack Overflow用户

发布于 2010-04-18 23:34:30

这里有一个PowerShell脚本来完成这项工作。它接受以下输入:

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="utf-8"?>
<Node>
    <ChildNode value1="5" value2="6" value3="happy" />
</Node>

...and将生成以下内容作为输出:

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="utf-8"?>
<Node>
  <ChildNode
    value1="5"
    value2="6"
    value3="happy" />
</Node>

这就是了:

代码语言:javascript
运行
复制
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提示符下键入以下内容:

代码语言:javascript
运行
复制
C:\formatxml.ps1 C:\Path\To\UglyFile.xml C:\Path\To\NeatAndTidyFile.xml

这个脚本基本上只是使用.NET框架,所以您可以很容易地将其移植到C#应用程序中。

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

Set-ExecutionPolicy RemoteSigned

不过,您只需这样做一次。

我希望这对你有用。

票数 14
EN

Stack Overflow用户

发布于 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非常高级,否则该工具应该可以很好地工作。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2568310

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档