Powershell,将XML输出到屏幕

33

我正在学习PowerShell。我可以将一个XML文件加载到一个变量中并对其进行操作。然后,我可以调用对象的save方法将其保存到磁盘中。但是,我希望有一种方法可以将结果XML输出到屏幕上。可是我找不到这种方法。除了先将其输出到文件再输出到屏幕之外,有其他方法吗?

6个回答

58

我无法让社区扩展正常工作,而且我也不想额外安装什么东西。我在Microsoft的博客上找到了另一种方法 -

function WriteXmlToScreen ([xml]$xml)
{
    $StringWriter = New-Object System.IO.StringWriter;
    $XmlWriter = New-Object System.Xml.XmlTextWriter $StringWriter;
    $XmlWriter.Formatting = "indented";
    $xml.WriteTo($XmlWriter);
    $XmlWriter.Flush();
    $StringWriter.Flush();
    Write-Output $StringWriter.ToString();
}

$xml = [xml]'<root><so><user name="john">thats me</user><user name="jane">do you like her?</user></so></root>'
WriteXmlToScreen $xml

1
很棒的解决方案。函数名称有些误导人,它与屏幕无关,Write-Output使标准函数输出,因此您可以将其捕获到变量$formatted = WriteXmlToScreen $xml中,或者将其管道传输到其他地方 WriteXmlToScreen $xml | Out-File $f - Nathan
1
这个解决方案比下载PSCX模块更简单、更不会干扰。谢谢! - Joey
1
如果您想将此函数用于XML元素,请从函数声明中删除[xml]数据类型(即function WriteXmlToScreen ($xml)),否则PowerShell会认为该变量是一个XML文档,并显示错误:“无法将值“System.Xml.XmlElement”转换为类型“System.Xml.XmlDocument”。 - Dave F
如果您将此函数用于在函数内部显示(调试)XML,请更改 Write-Output 为类似 Write-Host 的内容。 - Dave F

24

我所知道的唯一方法是使用 System.Xml 属性,例如 outerxml 或者 innerxml。只要源代码已经缩进,这些属性应该已经有了缩进好的代码。


3
有一点让我起初困惑。我必须在将xml数据加载到“$ xmlObject”之前设置“$ xmlObject.PreserveWhitespace = $ true”(其中xmlObject是您的变量名称),以便获取原始换行和缩进。 - Vimes
缩进应该独立于“PreserveWhitespace”。当输出到屏幕时可能变得相关。 - Emiliano Poggi
看起来是这样。如果没有使用PreserveWhitespace,输出到屏幕的大部分换行和缩进都会丢失,但保存到文件中则会保留它们。除了作为内部文本一部分的换行和缩进之外,它看起来是这样的。奇怪的是,在我的测试文件中,保存到文件时其中一个制表符被转换成了两个空格,但其他制表符都没问题。 - Vimes

7
[System.Xml.Linq.XDocument]::Parse($Xml.OuterXml).ToString()

1
如果 Linq 程序集不可用,请使用以下命令加载:[Reflection.Assembly]::LoadWithpartialName("System.Xml.Linq") | Out-Null - Paul

6
看看PSCX模块。你会发现Format-Xml命令,它正是做这件事的。
例子:
Import-Module pscx
$xml = [xml]'<root><so><user name="john">thats me</user><user name="jane">do you like her?</user></so></root>'
Format-Xml -InputObject $xml

将生成:

<root>
  <so>
    <user name="john">thats me</user>
    <user name="jane">do you like her?</user>
  </so>
</root>

查看更多信息,请参阅help format-xml -full


我将此标记为答案,因为即使没有嵌入式空格,它也应该允许进行良好的格式化。如果您不想安装扩展程序,并且您已经有了所有空格,请改用empo的答案。 - Vimes
PSCX模块中有许多很棒的功能,我之前并没有意识到。如果你是PS用户且还未安装该模块,那么它值得一试。 - Jordan Shurmer

2
我发现最干净的解决方案是使用 System.Xml.Linq.XDocument.Parse 这个方法:
Write-Host ([System.Xml.Linq.XDocument]::Parse("$(Get-Content -path 'c:\myxml.xml' -Raw)"));

1
这是一个旧的线程,但我想分享我的hackish答案。我需要将xml发送到php,但我不能发送其他任何东西。
我想出的答案是将文件保存到磁盘上,然后运行一次get content。这会回显xml文本而不是其他内容:
#hack alert.  
#we need to echo out just the text of the XML back to PHP. 

IF ("$env:TEMP\xml.xml") {Remove-Item "$env:TEMP\xml.xml"}
#$xmlDoc.Save("c:\temp\xml.xml")
$xmlDoc.Save("$env:TEMP\xml.xml")
get-content "$env:TEMP\xml.xml"

在我的情况下,我将其发送回 PHP,它完美地工作了。

@samaspin的回答应该可以解决问题... - Matthieu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接