簡體   English   中英

LINQ to Xml選擇元素

[英]LINQ to Xml Select Element

我在從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查詢-只需找到根目錄下具有正確名稱的第一個元素,然后將其轉換為字符串即可。 如果缺少相應的元素,則將為sid提供一個null值,因此您可以輕松地檢測到它並進行適當處理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM