【问题标题】:Get XElement with XPathSelectElement使用 XPathSelectElement 获取 XElement
【发布时间】: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>
        <Issr>Issr</Issr>
      </Othr>
    </FinInstnId>
  </Svcr>
</Acct>

就像我说的那样,我拥有的 XElement 是名为 acct 的标签。我现在尝试跟随以获取 &lt;BIC&gt;标签:

 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>
        <Issr>Issr</Issr>
      </Othr>
    </FinInstnId>
  </Svcr>
</Acct>

【问题讨论】:

    标签: c# xml xpath path xelement


    【解决方案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>
            <Issr>Issr</Issr>
          </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 更新答案
    • 谢谢,您的更新解决方案运行良好!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-04
    • 1970-01-01
    • 2022-12-16
    • 2012-02-24
    • 2010-10-01
    相关资源
    最近更新 更多