gpt4 book ai didi

xml - 列出子节点meta包含某个值123456的所有节点

转载 作者:行者123 更新时间:2023-12-03 17:03:14 26 4
gpt4 key购买 nike

我希望下面的脚本如果子节点meta包含Pdt 1,则输出Pdt3123456,但不输出。什么是正确的语法?

我知道问题来自条件标准语法@id='$_.id'

ForEach-Object {
$meta = $xml.SelectSingleNode("//catalogue/produits/produit[@id='$_.id']/metas/meta[@code='$meta_code']")
}

这是整个脚本的一部分:

$xml=[xml]@'
<?xml version="1.0" encoding="iso-8859-1"?>
<catalogue>
<produits>
<produit id="pdt1" libelle="produit 1" cat="PDT">
<metas date="2015.07.24">
<meta code="123456" value="123456"></meta>
<meta code="789012" value="ghijkl"></meta>
<meta code="345678" value="mnopqr"></meta>
</metas>
</produit>
<produit id="pdt2" libelle="produit 2" cat="PDT">
<metas date="2015.07.24">
<meta code="123456" value="abcdef"></meta>
<meta code="789012" value="ghijkl"></meta>
<meta code="345678" value="mnopqr"></meta>
</metas>
</produit>
<produit id="pdt3" libelle="produit 3" cat="PDT">
<metas date="2015.07.24">
<meta code="123456" value="123456"></meta>
<meta code="789012" value="ghijkl"></meta>
<meta code="345678" value="mnopqr"></meta>
</metas>
</produit>
</produits>
</catalogue>
'@

$meta_code = "123456"

$xml.catalogue.produits.produit | where {$_.cat.startsWith("PDT")} | ForEach-Object {
$meta = $xml.SelectSingleNode("//catalogue/produits/produit[@id='$_.id']/metas/meta[@code='$meta_code']")
if($meta) {Write-Host $_.libelle "in" $meta.code}
}

最佳答案

我认为问题出在您的XQuery字符串上:

$meta = $xml.SelectSingleNode("//catalogue/produits/produit[@id='$_.id']/metas/meta[@code='$meta_code']")

PowerShell将 $_.id解释为 $_.ToString() + ".id",在您的情况下,最终是 pdt1.id。当然,没有节点匹配该ID。

相反,将 $_.id包装为一个表达式 $($_.id):
$meta = $xml.SelectSingleNode("//catalogue/produits/produit[@id='$($_.id)']/metas/meta[@code='$meta_code']")

或者,更好的是,使用 -f字符串格式运算符:
$xquery = "//catalogue/produits/produit[@id='{0}']/metas/meta[@code='{1}']" -f $_.id,$meta_code
$meta = $xml.SelectSingleNode($xQuery)

您可以完全放弃对 SelectSingleNode的调用,因为您已经在 ForEach-Object脚本块中找到了该节点。您可以通过以下方式找到所需的元节点:
$xml.catalogue.produits.produit |
Where-Object { $_.cat -like 'PDT*' } |
ForEach-Object {
$produit = $_
$meta = $produit.metas.meta | Where-Object { $_.code -eq $meta_code }
if( $meta )
{
Write-Host -Message ('{0} in {1}' -f $produit.libelle,$meta.code)
}
}

关于xml - 列出子节点meta包含某个值123456的所有节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31842090/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com