使用linq从xml树获取属性

时间:2009-12-11 23:04:49

标签: linq-to-xml

我正在处理一个如下所示的xml文件:

<?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>

我需要循环遍历element5并检索Ienumberable中的属性,如下所示:

attr1,attr2,attr3,attr4,attr5,attr6

使用linq到xml和c#。我可以循环遍历element5并获取所有的attribute2信息,但我无法弄清楚如何获取我需要的父或子属性。

更新:感谢迄今为止的反馈。为清楚起见,我需要通过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的值,但我可能会因为我想要实现的目标而犯下这一切。我还需要在集合中收集上面提到的其他属性(Console引用只是我现在正在玩这个,但我需要的最终结果是一个集合)。所以最终的结果将是像

这样的集合
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

有意义吗?

3 个答案:

答案 0 :(得分:1)

使用linq-to-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 :(得分:1)

xdoc = XDocument.Load(Server.MapPath("Temp.xml"))
Dim x = From el As XElement In xdoc...<vehicles>.Descendants.Where(Function(f) f.@id.ToString = 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

答案 2 :(得分: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())