You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell处理Peppol XML发票:获取带/无属性节点文本的方法问询

统一获取Peppol XML发票中带/不带属性节点的文本内容

处理Peppol XML发票时,遇到部分节点包含属性(如<ID schemeID="IBAN">)、部分节点无属性(如<ID2>),需要统一获取这类节点的文本内容。

原测试代码及问题

原测试代码尝试用.InnerText等方法获取文本,但无法同时适配两种节点:

$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'均无法同时解决带属性和无属性节点的文本获取问题。目前可行的方案是使用Select-Xml,但不想重写现有脚本,需要替代方案。

替代解决方案

方案1:强制转换为字符串

利用PowerShell的类型转换特性,将节点直接转换为[string],无论节点是否带属性,都会返回其文本内容:

$BIC = [string]$Invoice.PaymentMeans.PayeeFinancialAccount.ID
$BIC2 = [string]$Invoice.PaymentMeans.PayeeFinancialAccount.ID2
Write-Output "BIC : $BIC"
Write-Output "BIC2: $BIC2"

方案2:封装通用获取函数

如果需要更灵活的处理,可以封装一个简单函数,统一处理不同类型的节点:

function Get-NodeText {
    param([System.Xml.XmlNode]$Node)
    # 优先取#text,若不存在则取InnerText
    return $Node.'#text' ?? $Node.InnerText
}

# 替换原有代码中的获取逻辑
$BIC = Get-NodeText $Invoice.PaymentMeans.PayeeFinancialAccount.ID
$BIC2 = Get-NodeText $Invoice.PaymentMeans.PayeeFinancialAccount.ID2
Write-Output "BIC : $BIC"
Write-Output "BIC2: $BIC2"

这两种方案都不需要大面积修改原有脚本,只需替换文本获取的部分逻辑即可。

内容的提问来源于stack exchange,提问作者Kees Netelvrees

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 13:48:23