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
相关产品推荐
相关产品推荐

