首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果节点具有属性,则Powershell不显示节点文本。

如果节点具有属性,则Powershell不显示节点文本。
EN

Stack Overflow用户
提问于 2022-08-06 20:08:52
回答 1查看 52关注 0票数 0

我试图处理Peppol发票。有时,同一节点具有属性,但有时没有。如何获得节点的文本,而不管它是否具有属性?

代码语言:javascript
复制
$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。

代码语言:javascript
复制
$BIC3=(select-xml 'PaymentMeans/PayeeFinancialAccount/ID' $Invoice).node."#text"
$BIC4=(select-xml 'PaymentMeans/PayeeFinancialAccount/ID2' $Invoice).node."#text"
Write-Output $BIC3 
Write-Output $BIC4 

似乎我必须重写脚本,但我希望还有其他解决方案。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-07 14:51:06

mclayton,:Powershell的“xml类型加速器”允许您在不使用.net DOM方法(例如$Invoice.PaymentMeans)的情况下按名称导航xml节点。如果一个元素只包含内部文本,它将作为字符串属性添加到其父元素上,否则它将被添加为System.Xml.XmlElement。你可以做一些类似的事情($Invoice…)ID -is字符串){#返回ID }或{#返回ID.InnerText }

代码语言:javascript
复制
$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"
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73262964

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档