【问题标题】:Get XML from String (not file)从字符串(不是文件)获取 XML
【发布时间】:2019-06-06 07:08:17
【问题描述】:

我有一个 PowerShell 脚本:

$xmlString="<root>
        <section>
            <node id='1'>AAA</node>
            <node id='2'>BBB</node>
            <node id='3'>CCC</node>
        </section>
    </root>"

$xml = New-Object -TypeName System.Xml.XmlDocument
$content = $xml.LoadXml($xmlString)

$content 的值为 null

$xml 变量中的内部异常是 &lt;Error retrieving property - ArgumentException&gt;

我检查了字符串是否以[System.Text.Encoding]::UTF8.GetPreamble() 开头,但不是。

您能告诉我将这样的字符串转换为 XML 的正确方法是什么?

【问题讨论】:

  • 您只是误解了LoadXML() 的工作原理。导入的 XML 位于变量 $xml 中,而不是 $content。该方法不返回任何内容,因此$content 为空。
  • @AnsgarWiechers 我已将您的后续跟进添加到我的回答中 :)
  • @Paxz 骗子;þ
  • @AnsgarWiechers 想要自己回答吗? :D 我仍然可以回滚 ;)
  • @Paxz 不,我很好。

标签: xml string powershell


【解决方案1】:

您可以像这样直接将字符串转换为XmlDocument

[xml]$xmlString="<root>
        <section>
            <node id='1'>AAA</node>
            <node id='2'>BBB</node>
            <node id='3'>CCC</node>
        </section>
    </root>"

如果你想保持变量的格式,你可以这样做:

$xmlString="<root>
        <section>
            <node id='1'>AAA</node>
            <node id='2'>BBB</node>
            <node id='3'>CCC</node>
        </section>
    </root>"

[xml]$content = $xmlString

要跟进@AnsgarWiechers 的评论,如果你真的想使用LoadXML,它应该是这样的:

$xmlString=
"<root>
        <section>
            <node id='1'>AAA</node>
            <node id='2'>BBB</node>
            <node id='3'>CCC</node>
        </section>
</root>"

$xml = New-Object -TypeName System.Xml.XmlDocument
$xml.LoadXml($xmlString)

LoadXml 会将给定字符串中的值加载到调用该方法的$xml 变量中。

它不返回任何值,而是将其保存到$xml

【讨论】:

    【解决方案2】:

    ConvertFrom-Xml 就是你所需要的!

    它可以作为Avande.CoolFunctions 的一部分从 PowerShell 库中获得

    $xmlString = @"
    <root>
        <section>
            <node id='1'>AAA</node>
            <node id='2'>BBB</node>
            <node id='3'>CCC</node>
        </section>
    </root>
    "@
    
    $xmlString | ConvertFrom-Xml
    

    【讨论】:

    • 据我所知,ConvertFrom-Xml 不是 powershell 内置 cmdlet。但是,像 @Paxz 那样简单地使用 [xml] 进行投射是可行的方法。
    • 你是对的@Theo!我在我的答案中添加了指向 CmdLet 源的链接。
    猜你喜欢
    • 2016-05-22
    • 1970-01-01
    • 2016-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多