2009-12-11 102 views
1

从XML树属性我有一个xml文件,看起来像这样的工作:获得使用LINQ

<?xml version="1.0" encoding="UTF-8"?> 
<element1 xmlns="http://namespace1/"> 
    <element2> 
    <element3> 
     <element4 attr1="2009-11-09"> 
     <element5 attr2="NAME1"> 
      <element6 attr3="1"> 
      <element7 attr4="1" attr5="5.5" attr6="3.4"/> 
      </element6> 
     </element5> 
     <element5 attr2="NAME2"> 
      <element6 attr3="1"> 
      <element7 attr4="3" attr5="4" attr6="4.5"/> 
      </element6> 
     </element5> 
     </element4> 
    </element3> 
    </element2> 
</element1> 

哪里需要遍历元素5和检索像这样在Ienumberable属性:

attr1,attr2,attr3,attr4,attr5,attr6

使用linq to xml和c#。我可以遍历元素5并获取所有的属性2信息使用,但我无法弄清楚如何获得我需要的父或子属性。

更新:感谢迄今为止的反馈。为了清楚起见,我需要通过attribute5进行循环。所以基本上,我现在所拥有的(并不多)是。 。 。

XElement xel = XElement.Load(xml); 
IEnumberable<XElement> cList = from el in xel.Elements(env + "element2").Element 
(n2 + "element3").Elements(n2 + "element4").Elements(ns + "element5") select el; 

foreach (XElement e in cList) 
Console.WriteLine(e.Attribute("attr2").Value.ToString()); 

这会给我的价值在循环中的所有ATTR 2,但我可能会对此都错了什么我想acheive。我还需要在集合中收集上面提到的其他属性(控制台引用只是我现在正在玩这个,但我需要的最终结果是集合)。所以最终的结果将是一个集合像

attr1,  attr2, attr3, attr4, attr5, attr6 
2009-11-09, name1, 1,  1,  5.5, 3.4 
2009-11-09, name2, 1,  3,  4,  4.5 

让感觉?

+0

我不能完全确定要如何返回数据,有多个元素5元素。你想要一个可枚举,返回attr1,attr2,attr3,..,attr6,attr1(下一个元素)?或者是一个带有attr1到attr6的对象的枚举? – 2009-12-11 23:17:17

+0

如果对我们是否回答了您的问题有所反馈,我们会很高兴,如果不是,我们的问题不是很对......您现在有两个答案,请给我们一些反馈。 – LorenVS 2009-12-11 23:55:46

+0

尝试添加评论,但超过了600个字符的限制,因此我更新了该帖子。 – nelsonwebs 2009-12-12 01:22:30

回答

0

不完全清楚,但是这可能是一个起点:

XElement el = // something here 
el.Descendants().Concat(new XElement[]{el}).SelectMany(e => e.Attributes()) 

我不认为我有你在寻找什么?你说的好像你已经开始用引用元素5,你想上下树?

编辑:我想这可能是你在找什么(再次阅读您的问题尚未后):

XElement el = // something here 
el.Descendants().Concat(new XElement[]{el}).Where(e => e.Name.LocalName == "element5").SelectMany(e => e.Attributes()) 
+0

对不起,我在上面添加了一些附加说明。 – nelsonwebs 2009-12-12 01:23:03

1

使用LINQ到XML导航树达(父/祖先)或向下(元素/元素/后代)。详情请参阅msdn

XDocument doc 

var q = from element5 in doc.Elements("element5") 
     let element4 = element5.Parent 
     let element6 = element5.Element("element6") 
     let element7 = element6.Element("element7") 
     select new { 
        attr1 = (DateTime)element4.Attribute("attr1"), 
        attr2 = (string)element5.Attribute("attr2"), 
        attr3 = (int)element6.Attribute("attr3"), 
        attr4 = (int)element7.Attribute("attr4") 
        attr5 = (float)element7.Attribute("attr5") 
        attr6 = (float)element7.Attribute("attr6") 
        } 
1
xdoc = XDocument.Load(Server.MapPath("Temp.xml")) 
Dim x = From el As XElement In xdoc...<vehicles>.Descendants.Where(Function(f) [email protected] = id.ToString) 
Dim at = From a In x.Attributes() 
For Each t In at 
Dim n = t.Name 
Dim v = t.Value 
ProcessForm(n.ToString, v) 
Next 
+0

对不起,这是在VB中,但你可以很容易地转换为C#。如果您需要在不知道名称或值的情况下获取元素的所有属性,请使用它遍历元素的所有属性并执行任何操作。忽略我的processform(),因为这是我用来处理属性的函数。希望这可以帮助 – philljohn 2011-01-07 10:58:39