首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LINQ到Xml选择元素

问LINQ到Xml选择元素
EN

Stack Overflow用户
提问于 2014-06-18 10:13:36
回答 1查看 88关注 0票数 0

我遇到了一些实际问题,就是从XML中获取元素值。我似乎一直对XML有问题。对于其他人来说,完美的代码不是我的代码,我一定是遗漏了什么,但我不知道是什么。

我有以下XML:

代码语言:javascript
复制
    <?xml version="1.0" encoding="UTF-8"?>
<license xmlns="http://http://lilleker-it.co.uk/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <SID>S-1-5-21-1231312-12344234-12312312</SID>
   <Email>me@myurl.com</Email>
   <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/2000/09/xmldsig#rsa-sha1" />
         <Reference URI="">
            <Transforms>
               <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
            </Transforms>
            <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
            <DigestValue>aZd9Jsbqif+8KKRYuaKzuXTLPGA=</DigestValue>
         </Reference>
      </SignedInfo>
      <SignatureValue>PB613rI/Nh4E3LBY0pG52vTCsH6dple2nXXjnnHhpsW2ZOG6lcMPmPmQWAzZVEPDPACg44Tn37hBoRBoRZ4T98qwB5tRfDRD9jXgcC912334dfDFADdcdkoYXTSiVaVWsUe4x3T665VKf8Dej2e9bFXOuhCegXA5BP1Jeak=</SignatureValue>
   </Signature>
</license>

我需要的是选择Email和SID的值,但是我似乎无法让它工作,我已经尝试了以下代码:

代码语言:javascript
复制
var query = doc.Descendants("license").Select(s => new
                {
                    EMAIL = s.Element("Email").Value,
                    SID = s.Element("SID").Value
                }).ToList();
                string e = query[0].EMAIL;
                string id = query[0].SID;

以及:

代码语言:javascript
复制
string e = doc.Root.Element("license")
              .Elements("Email")
              .SingleOrDefault()
              .Value;

所有这些都不返回值,总是null,我不明白为什么。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-18 10:18:40

您的两个示例代码段都会失败,因为它们在没有名称空间中寻找元素。第二个示例也将失败,因为您正在根元素下寻找一个license元素,而实际上它是根元素。

您需要使用正确的命名空间。例如,要修复您的第一个查询(因为看起来它正在执行您想要的更多操作),您可以使用:

代码语言:javascript
复制
XNamespace ns = "http://http://lilleker-it.co.uk/";
var query = doc.Descendants(ns + "license").Select(s => new
                {
                    EMAIL = s.Element(ns + "Email").Value,
                    SID = s.Element(ns + "SID").Value
                }).ToList();
string e = query[0].EMAIL;
string id = query[0].SID;

尽管就我个人而言,我处理这件事的方式非常不同:

代码语言:javascript
复制
XNamespace ns = "http://http://lilleker-it.co.uk/";
string e = (string) doc.Root.Element(ns + "Email");
string id = (string) doc.Root.Element(ns + "SID");

这里根本不需要使用LINQ查询--只需在根下面找到第一个元素,并将其转换为字符串。如果缺少相应的元素,这将为每个s或id提供一个s值,因此您可以很容易地检测到该值,并对其进行适当处理。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24282906

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档