我试图处理Peppol发票。有时,同一节点具有属性,但有时没有。如何获得节点的文本,而不管它是否具有属性?
$xml=[xml]@"
<Invoice>
<PaymentMeans>
<PayeeFinancialAccount>
<ID schemeID="IBAN">BE29 3100 0335</ID>
<ID2>BE29 3100 0335</ID2>
</PayeeFinancialAccount>
</PaymentMeans>
</Invoice>
"@
$Invoice=$xml.Invoice
$BIC=$Invoice.PaymentMeans.PayeeFinancialAccount.ID.InnerText
$BIC2=$Invoice.PaymentMeans.PayeeFinancialAccount.ID2.InnerText
Write-Output "BIC : $BIC"
Write-Output "BIC : $BIC2".InnerText、.InnerXml、.OuterXml和.'#text‘不是解决方案。
不过,一个可行的解决方案是使用使用Xpath的select-xml。
$BIC3=(select-xml 'PaymentMeans/PayeeFinancialAccount/ID' $Invoice).node."#text"
$BIC4=(select-xml 'PaymentMeans/PayeeFinancialAccount/ID2' $Invoice).node."#text"
Write-Output $BIC3
Write-Output $BIC4 似乎我必须重写脚本,但我希望还有其他解决方案。
发布于 2022-08-07 14:51:06
mclayton,:Powershell的“xml类型加速器”允许您在不使用.net DOM方法(例如$Invoice.PaymentMeans)的情况下按名称导航xml节点。如果一个元素只包含内部文本,它将作为字符串属性添加到其父元素上,否则它将被添加为System.Xml.XmlElement。你可以做一些类似的事情($Invoice…)ID -is字符串){#返回ID }或{#返回ID.InnerText }
$xml=[xml]@"
<Invoice>
<PaymentMeans>
<PayeeFinancialAccount>
<ID schemeID="IBAN">BE29 3100 0335 4064</ID>
<ID2>BE29 3100 0335 4064</ID2>
</PayeeFinancialAccount>
</PaymentMeans>
</Invoice>
"@
$Invoice=$xml.Invoice
$BIC=$Invoice.PaymentMeans.PayeeFinancialAccount.ID
$BICID=if($BIC -is [string]) { $BIC } else { $BIC.InnerText }
Write-Output "BIC: $BICID"https://stackoverflow.com/questions/73262964
复制相似问题