我正在使用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文件也有其他垃圾,但我把它剥离了,希望专注于我需要的位。也许我已经剥离太多而且背景已经丢失了?
答案 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'."