2013-01-24 137 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

这是完全正确的,我已经更新了我的帖子 –