[英]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.