使用命名空间查询XML节点

时间:2017-09-17 12:29:34

标签: c# xml linq-to-xml

我的目标是能够从此XML文件中检索<Cdtr><Id>的值:

<?xml version="1.0" encoding="UTF-8"?>
<Document xmlns="urn:com.firmaname:response.002">
    <DocId>1261076951</DocId>
    <CreateDtTm>2016-11-23T14:53:23.938Z</CreateDtTm>
    <ResponseCd>OK</ResponseCd>
    <Dbtr>
        <Id>debtorId</Id>
        <Name>debtorName</Name>
    </Dbtr>
    <Cdtr>
        <Id>creditorId</Id>
        <Name>creditorName</Name>
    </Cdtr>
</Document>

请注意,此文件有2个<Id>个节点,因此我必须指定节点的确切路径。结果应该是'creditorId&#39;。

我的代码是:

XNamespace ns = "urn:com.firmaname:response.002";
var results = requestMessage.Descendants(ns + "Id").First().Value;

但是这将会回归'debtorId&#39;。我在这里搜索了一种检索确切路径的方法,但它们似乎都涉及使用带有XElement的Xpath。使用XElement时,我遇到了命名空间问题。我找到的所有建议都是关于使用XDocument ...

1 个答案:

答案 0 :(得分:0)

我仍然会使用XDocument并选择Cdtr节点,然后选择其中的Id节点。

如果您确信不需要名称空间,则可以使用<element>.Name.LocalName

XDocument doc = XDocument.Load("<path to xml");

XNamespace ns = "urn:com.firmaname:response.002";

var creditorid = doc.Descendants().Elements()
    .Where(e => e.Name == ns + "Cdtr").Elements()
    .First(e => e.Name == ns + "Id");
  

使用LocalName更新

var creditorid = doc.Descendants().Elements()
    .Where(e => e.Name.LocalName == "Cdtr").Elements()
    .First(e => e.Name.LocalName == "Id");

这很有效,但是如果可以,你应该使用命名空间。