使用 XPathSelectElement 获取 XElement
Posted
技术标签:
【中文标题】使用 XPathSelectElement 获取 XElement【英文标题】:Get XElement with XPathSelectElement 【发布时间】:2021-06-06 09:22:25 【问题描述】:我有一个 XML 文件并将特定标签 <Acct>
加载到 XElement
。从这个XElement
中想要给出一个路径来获取特定的子<BIC>
元素。我不想使用Descendates()
方法。我尝试使用 XPathSelectElement
来完成工作,但它总是返回 null。
我的 XML 片段看起来像这样:
<Acct>
<Id>
<IBAN>TestIban</IBAN>
</Id>
<Ccy>EUR</Ccy>
<Svcr>
<FinInstnId>
<BIC>TestBic</BIC>
<ClrSysMmbId>
<ClrSysId>
<Cd>TestSysId</Cd>
</ClrSysId>
<MmbId>TestMemberId</MmbId>
</ClrSysMmbId>
<Nm>TestName</Nm>
<PstlAdr>
<AdrLine>TestAdrLine</AdrLine>
</PstlAdr>
<Othr>
<Id>OtherId</Id>
<Is-s-r>Is-s-r</Is-s-r>
</Othr>
</FinInstnId>
</Svcr>
</Acct>
就像我说的那样,我拥有的 XElement 是名为 acct 的标签。我现在尝试跟随以获取
<BIC>
标签:
var bic = acct.XPathSelectElement("Svrc/FinInstnId/BIC");
var bic = acct.XPathSelectElement("/Svrc/FinInstnId/BIC");
var bic = acct.XPathSelectElement("./Svrc/FinInstnId/BIC");
var bic = acct.XPathSelectElement("Svrc//FinInstnId//BIC");
var bic = acct.XPathSelectElement("//Svrc//FinInstnId//BIC");
var bic = acct.XPathSelectElement(".//Svrc//FinInstnId//BIC");
var bic = acct.XPathSelectElement("Acct/Svrc/FinInstnId/BIC");
var bic = acct.XPathSelectElement("/Acct/Svrc/FinInstnId/BIC");
var bic = acct.XPathSelectElement("./Acct/Svrc/FinInstnId/BIC");
var bic = acct.XPathSelectElement("Acct//Svrc//FinInstnId//BIC");
var bic = acct.XPathSelectElement("//Acct//Svrc//FinInstnId//BIC");
var bic = acct.XPathSelectElement(".//Acct//Svrc//FinInstnId//BIC");
但所有这些都返回 null。我找到了这篇文章,他们在我看来完全一样: https://codereview.stackexchange.com/questions/204464/get-a-xelement-at-a-given-path
所以我的问题是我如何使用我的 XElement 中的 XPathSelectElement 方法来获得像 XElement 一样的标签的孩子?
编辑:
我使用 Text Visualizer 在调试模式下检查了 XElement。 Element 中的 XML 如下所示(元素的值不同,但这不应该改变问题):
<Acct xmlns="urn:iso:std:iso:20022:tech:xsd:camt.053.001.02">
<Id>
<IBAN>TestIban</IBAN>
</Id>
<Ccy>EUR</Ccy>
<Svcr>
<FinInstnId>
<BIC>TestBic</BIC>
<ClrSysMmbId>
<ClrSysId>
<Cd>Cd</Cd>
</ClrSysId>
<MmbId>TestMbmId</MmbId>
</ClrSysMmbId>
<Nm>SomeName</Nm>
<PstlAdr>
<AdrLine>Address</AdrLine>
</PstlAdr>
<Othr>
<Id>Id</Id>
<Is-s-r>Is-s-r</Is-s-r>
</Othr>
</FinInstnId>
</Svcr>
</Acct>
【问题讨论】:
【参考方案1】:代码运行良好
var xmlString = @"<root>
<Acct>
<Id>
<IBAN>TestIban</IBAN>
</Id>
<Ccy>EUR</Ccy>
<Svcr>
<FinInstnId>
<BIC>TestBic</BIC>
<ClrSysMmbId>
<ClrSysId>
<Cd>TestSysId</Cd>
</ClrSysId>
<MmbId>TestMemberId</MmbId>
</ClrSysMmbId>
<Nm>TestName</Nm>
<PstlAdr>
<AdrLine>TestAdrLine</AdrLine>
</PstlAdr>
<Othr>
<Id>OtherId</Id>
<Is-s-r>Is-s-r</Is-s-r>
</Othr>
</FinInstnId>
</Svcr>
</Acct>
</root>";
XDocument doc = XDocument.Parse(xmlString);
XElement acct = doc.XPathSelectElement("root/Acct");
XElement element = acct.XPathSelectElement("Svcr/FinInstnId/BIC");
Console.WriteLine(element.Value);
//print "TestBic"
您确定 acct
包含正确的 XElement 吗?
使用命名空间更新
XDocument doc = XDocument.Parse(xmlString);
var reader = doc.CreateReader();
XmlNamespaceManager nsmgr = new XmlNamespaceManager(reader.NameTable);
nsmgr.AddNamespace("ns", "urn:iso:std:iso:20022:tech:xsd:camt.053.001.02");
XElement acct = doc.XPathSelectElement("//ns:Acct", nsmgr);
XElement element = acct.XPathSelectElement("*[local-name() = 'Svcr']/*[local-name() = 'FinInstnId']/*[local-name() = 'BIC']");
var anotherWay = acct.XPathSelectElement("ns:Svcr/ns:FinInstnId/ns:BIC", nsmgr);
local-name()
可以忽略命名空间
【讨论】:
@Max 更新答案 谢谢,您的更新解决方案运行良好!以上是关于使用 XPathSelectElement 获取 XElement的主要内容,如果未能解决你的问题,请参考以下文章
iframe简单使用 获取iframe 获取iframe 元素值 iframe获取父页面的信息