使用PowerShell

时间:2015-12-16 17:58:13

标签: xml 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文件也有其他垃圾,但我把它剥离了,希望专注于我需要的位。也许我已经剥离太多而且背景已经丢失了?

1 个答案:

答案 0 :(得分:1)

您可以使用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'."