LINQ到Xml选择元素
本文关键字:元素 选择 Xml LINQ | 更新日期: 2023-09-27 18:09:20
我有一些真正的问题,从我的XML获得元素值。我似乎总是遇到XML方面的问题。代码完美地为别人工作不会为我的,我一定是错过了什么,但我不知道是什么。
我有以下XML:
<?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>
我需要的是选择电子邮件和SID的值,但是我似乎无法让它工作,我尝试了以下代码:
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;
以及:
string e = doc.Root.Element("license")
.Elements("Email")
.SingleOrDefault()
.Value;
这些都不返回值,总是null,我不明白为什么。
您的两个示例代码片段都将失败,因为它们正在寻找没有名称空间的元素。第二个示例也将失败,因为您正在根元素下寻找license
元素,而实际上它是根元素。
您需要使用正确的命名空间。例如,要修复您的第一个查询(因为看起来它做了更多您想要的),您可以使用:
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;
尽管我个人会有不同的处理方式:
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
提供null
值,因此您可以轻松地检测并适当地处理它。