繁体   English   中英

PowerShell - 解析 XML 字符串

[英]PowerShell - Parse string that is XML

我正在运行 SQL 查询,返回的字段之一包含格式为 XML 的字符串。 返回的字符串是包含所有元素的一行,我添加了回车符以提高可读性。 我尝试使用“convertto-xml”将字符串转换为 XML,它似乎创建了一个 XML 对象,但我似乎无法解析它。 我很容易承认我是处理 XML 的新手,但我似乎无法解析这些对象。 我特别想找到名为“TO”的参数的值。 我曾尝试寻找“childnodes”和“innertext”,但无法枚举元素。 我什至不确定转换后这些是元素还是属性。

这是字符串:

$String = "
<ParameterValues>
    <ParameterValue>
        <Name>TO</Name>
        <Value>Address1@domain.com;address2@domain.com</Value>
    </ParameterValue>
    <ParameterValue>
        <Name>Subject</Name>
        <Value>Emailsubject</Value>
    </ParameterValue>
    <ParameterValue>
        <Name>Comment</Name>
        <Value>ReportComment</Value>
    </ParameterValue>
    <ParameterValue>
        <Name>RenderFormat</Name>
        <Value>MHTML</Value>
    </ParameterValue>
    <ParameterValue>
        <Name>Priority</Name>
        <Value>Normal</Value>
    </ParameterValue>
    <ParameterValue>
        <Name>IncludeLink</Name>
        <Value>true</Value>
    </ParameterValue>
    <ParameterValue>
        <Name>IncludeReport</Name>
        <Value>true</Value>
    </ParameterValue>
</ParameterValues>
"

我用过: $Newstring = $string | 转换为 xml

获取 XML 对象。 如何处理参数值“TO”? 点寻址似乎不起作用

正如vonPryz评论的那样,您可以使用[xml]类型加速器将字符串读取为 XML。

然后很容易得到你想要的值:

[xml]$xml = $string
$to = ($xml.ParameterValues.ParameterValue | Where-Object { $_.Name -eq 'TO' }).Value -split ';'
$to

结果:

Address1@domain.com
address2@domain.com

@Theo 的好答案类似,有几种方法可以获取数据,但它们都植根于 [XML] 类型加速器中。

$String = "
<ParameterValues>
    <ParameterValue>
        <Name>TO</Name>
        <Value>Address1@domain.com;address2@domain.com</Value>
    </ParameterValue>
    <ParameterValue>
        <Name>Subject</Name>
        <Value>Emailsubject</Value>
    </ParameterValue>
    <ParameterValue>
        <Name>Comment</Name>
        <Value>ReportComment</Value>
    </ParameterValue>
    <ParameterValue>
        <Name>RenderFormat</Name>
        <Value>MHTML</Value>
    </ParameterValue>
    <ParameterValue>
        <Name>Priority</Name>
        <Value>Normal</Value>
    </ParameterValue>
    <ParameterValue>
        <Name>IncludeLink</Name>
        <Value>true</Value>
    </ParameterValue>
    <ParameterValue>
        <Name>IncludeReport</Name>
        <Value>true</Value>
    </ParameterValue>
</ParameterValues>
"

$String = [XML]$String

( $String.ParameterValues.ParameterValue | 
Where-Object{ $_.Name -eq 'TO' } ).Value

使用.Where()方法的略短版本:

#...
( $String.ParameterValues.ParameterValue).Where( { $_.Name -eq 'TO' } ).Value

特定的 XML 结构使这有点令人困惑。 在每个 ParameterValue 元素内部本质上是一个 Name/Value 对,它在概念上看起来很像一个字典对象。 因此,如果您必须超越仅获取一个值,也许您实际上可以转换为字典; 就像是:

$Hash = @{}
$String.ParameterValues.ParameterValue |
ForEach-Object{
    $Hash.Add( $_.Name, $_.Value )
}

$Hash.To
$Hash.Subject
$Hash.Comment
# ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM