加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 使用XDocument查找元素属性

发布时间:2020-12-15 04:33:06 所属栏目:百科 来源:网络整理
导读:我正在尝试从以下 XML结构获取PurchaseDate(来自 Windows Phone中的应用内购买的收据): Receipt Version="1.0" CertificateId="..." xmlns="http://schemas.microsoft.com/windows/2012/store/receipt" ProductReceipt PurchasePrice="$0" PurchaseDate="20
我正在尝试从以下 XML结构获取PurchaseDate(来自 Windows Phone中的应用内购买的收据):
<Receipt Version="1.0" CertificateId="..." xmlns="http://schemas.microsoft.com/windows/2012/store/receipt">
  <ProductReceipt PurchasePrice="$0" PurchaseDate="2013-05-20T19:27:09.755Z" Id="..." AppId="..." ProductId="Unlock" ProductType="Consumable" PublisherUserId="..." PublisherDeviceId="..." MicrosoftProductId="..." />
  <Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
    <SignedInfo>
      <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />
      <SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256" />
      <Reference URI="">
        <Transforms>
          <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
        </Transforms>
        <DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" />
        <DigestValue>...</DigestValue>
      </Reference>
    </SignedInfo>
    <SignatureValue>...</SignatureValue>
  </Signature>
</Receipt>

我的代码如下:

XDocument doc = XDocument.Parse(receiptXml);

string date = doc.Root.Element("ProductReceipt").Attribute("PurchaseData").Value;

这会不断引发访问错误,因为doc.Root.Element(“ProductReceipt”)为null.为什么XDocument没有获得ProductReceipt元素?

解决方法

只需将命名空间添加到LINQ to XML查询中即可.因为您在根节点xmlns =“http://schemas.microsoft.com/windows/2012/store/receipt”上有默认名称空间声明,所以您还需要在查询中指定它.

下一个代码显示了一个示例

XDocument doc = XDocument.Parse(receiptXml);

XNamespace xmlns = "http://schemas.microsoft.com/windows/2012/store/receipt";

string date = doc.Root
                 .Element(xmlns + "ProductReceipt")
                 .Attribute("PurchaseDate")
                 .Value;

Console.WriteLine(date);

打印:

2013-05-20T19:27:09.755Z

还有一种名称空间不可知的方法:

string date = doc.Root
                 .Elements()
                 .First(node => node.Name.LocalName == "ProductReceipt")
                 .Attribute("PurchaseDate")
                 .Value;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读