2014-06-18 195 views
0

我有一些真正的問題從我的XML中獲取元素值。我似乎總是遇到與XML有關的問題。代碼完全適合其他人對我的,我必須失去一些東西,但我不知道是什麼。LINQ到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>[email protected]</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; 

沒有這些回報的價值,總是空,我看不到W¯¯ HY。

回答

1

這兩個示例代碼片斷都會失敗,因爲它們正在尋找沒有命名空間的元素。您的第二個樣本將失敗,因爲您正在尋找一個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值,以便您可以輕鬆檢測並適當處理它。

+0

謝謝你,完美的作品。我想我對XML的理解還是有點偏離。不幸的是,由於這個愚蠢的計時器,我無法接受你的答案。不過,我會回來接受。 – Ben