繁体   English   中英

使用PowerShell识别XML中的特定节点

[英]Identifying a particular node in XML using PowerShell

我正在处理XML文档,但不确定如何解析它以查找特定节点。

在下面的示例中,我将搜索ProductB并期望识别Bee Hive

<PRODUCTS>
    <PRODUCT_LEVEL_1>
        <PRODUCT_ID>ProductA</PRODUCT_ID>
        <PRODUCT_NAME>Ant Hill</PRODUCT_NAME>
        <PRODUCT_ID>ProductB</PRODUCT_ID>
        <PRODUCT_NAME>Bee Hive</PRODUCT_NAME>
        <PRODUCT_ID>ProductC</PRODUCT_ID>
        <PRODUCT_NAME>Centipede Hotel</PRODUCT_NAME>
    </PRODUCT_LEVEL_1>
</PRODUCTS>

我什至不确定如何引用这种XML格式,这使得搜索变得困难。

非常感谢您提供的任何帮助。

编辑:目前,我正在使用以下命令从文件加载XML:

System.Xml.XmlDocument] $xd = new-object System.Xml.XmlDocument
$file = resolve-path($inputFile)
$xd.load($file)
$nodelist = $xd.selectnodes("/PRODUCTS/PRODUCT_LEVEL_1")
foreach ($documentNode in $nodelist) {
    #do some stuff
}

实际的XML文件也包含其他垃圾的负载,但我将其删除,以期集中精力于所需的位。 也许我剥离得太多了,上下文已经丢失了?

您可以将XPath用于此任务。 XPath具有轴,使您可以引用文档的之前和之后元素:

filter Prepare-StringForXPath {
    param(
        [Parameter(ValueFromPipeline)]
        [String]$String
    )
    if($String -notlike '*''*') {
        "'$String'"
    } elseif($String -notlike '*"*') {
        """$String"""
    } else {
        “concat($(($String -split '(?<=''[^"]*)(?=")|(?<="[^'']*)(?='')' | Prepare-StringForXPath) -join ', '))”
    }
}

$xd = [Xml]@'
<PRODUCTS>
    <PRODUCT_LEVEL_1>
        <PRODUCT_ID>ProductA</PRODUCT_ID>
        <PRODUCT_NAME>Ant Hill</PRODUCT_NAME>
        <PRODUCT_ID>ProductB</PRODUCT_ID>
        <PRODUCT_NAME>Bee Hive</PRODUCT_NAME>
        <PRODUCT_ID>ProductC</PRODUCT_ID>
        <PRODUCT_NAME>Centipede Hotel</PRODUCT_NAME>
    </PRODUCT_LEVEL_1>
</PRODUCTS>
'@

$ProdName = Read-Host 'Input product name'
$ProdID = $xd.SelectSingleNode("//PRODUCT_NAME[.=$(Prepare-StringForXPath $ProdName)]/preceding-sibling::PRODUCT_ID[1]").InnerText
"Product ID for '$ProdName' is '$ProdID'."

$ProdID = Read-Host 'Input product ID'
$ProdName = $xd.SelectSingleNode("//PRODUCT_ID[.=$(Prepare-StringForXPath $ProdID)]/following-sibling::PRODUCT_NAME[1]").InnerText
"Product name for '$ProdID' is '$ProdName'."

暂无
暂无

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

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