2013-01-24 197 views
15

我有一個XML結果這樣其名稱的值的XDocument獲取XML元素屬性

<response> 
    <lst name="responseHeader"> 
    <int name="status">0</int> 
    <int name="QTime">16</int> 
    </lst> 
    <result name="response" numFound="3" start="0" maxScore="1.0"> 
    <doc> 
     <str name="ContaFirstname"> 
     firstname1             
     </str> 
     <str name="ContaId">6557</str> 
     <str name="ContaJobTitle">Manager</str> 
     <str name="ContaSurname">surname1 
     </str> 
    </doc> 
    <doc> 
     <str name="ContaFirstname">firstname2</str> 
     <str name="ContaId">6203</str> 
     <str name="ContaJobTitle">Director</str> 
     <str name="ContaSurname">surname2</str> 
    </doc> 
    </result> 
</response> 

我想要得到的對象的列表,每個對象將包含的ContaFirstname值,ContaIdContaJobTitleContaSurname

我想這樣的事情,而是因爲我讓他們所有NULL那是不對的

var test = from c in xml.Descendants("doc") 
        select new 
        { 
         firstname = c.Element("ContaFirstname"), 
         surnmane = c.Element("ContaSurname") 
        }; 

那麼如何通過名稱訪問這些元素?

+1

你想要結果是字符串還是XElements?你接受的答案會給你一些元素。 –

+0

是的,其實我做了一個簡單的演員來獲得我想要的。 – kbaccouche

回答

31

您不想訪問名稱的元素,因爲大多數人會解釋該聲明。您想在自己的name屬性的值來訪問元素:

firstname = (string) c.Elements("str") 
         .First(x => x.Attribute("name").Value == "ContaFirstname"); 
//etc 

你可能想的是抽象成一個單獨的方法,因爲這將是一個痛苦的做多次。例如:

public static XElement ElementByNameAttribute(this XContainer container, 
               string name) 
{ 
    return container.Elements("str") 
        .First(x => x.Attribute("name").Value == name); 
} 

然後:

var test = from c in xml.Descendants("doc") 
      select new 
      { 
       firstname = c.ElementByNameAttribute("ContaFirstname").Value, 
       surnmane = c.ElementByNameAttribute("ContaSurname").Value 
      }; 

如果您有任何的機會,讓您的文檔更合理的結構,這將是最好...

+0

謝謝你的回答,你是對的,這是令人困惑的。我編輯了我的問題標題以避免這種情況。 – kbaccouche

+0

@the_ruby_racer:看到我的編輯包含一個擴展方法,它會讓你的生活比重複相同的代碼更容易一次又一次。 –

+0

不錯!我接受了更完整的答案。謝謝! – kbaccouche

3

這是否解決您的問題:

var test = from c in xml.Descendants("doc") 
      select new 
      { 
       firstname = c.Elements("str").First(element => element.Attribute("name").Value == "ContaFirstname"), 
       surnmane = c.Elements("str").First(element => element.Attribute("name").Value == "ContaSurname") 
      }; 

或者,如果你想要的值(而不是XElement

var test = from c in xml.Descendants("doc") 
      select new 
      { 
       firstname = c.Elements("str").First(element => element.Attribute("name").Value == "ContaFirstname").Value, 
       surnmane = c.Elements("str").First(element => element.Attribute("name").Value == "ContaSurname").Value 
      }; 
+0

是的,那正是我所需要的。謝謝! – kbaccouche

+1

這將使屬性'XElement'引用,這對我來說似乎很奇怪。 –

+0

這是完全正確的,我已經更新了我的帖子 –