LinqToXML:访问子元素

时间:2014-08-16 12:25:16

标签: c# xml linq

我试图找出解决我遇到的一个小问题的方法,但过去两天我没有取得多大成功。我在这里经历了很多帖子,但我没有为自己找到合适的解决方案。我知道这对你们来说可能是个基本问题,但似乎我已经失去了关注,并且可以清楚地思考这个问题。

所以,这就是问题所在。我在下面有一个示例XML,具有我需要的结构。我想要的是阅读这个XML,转到我想要的事件,而不是读取/存储所有测试元素。

<Config>
<Events>
<Event_1>
        <NameOfEvent>SomeName:</NameOfEvent>
        <test id="test001">
                <xpath>"some xpath"</xpath>
                <value>someValue1</value>
                <tagName>none</tagName>
            </test>
            <test id="test002">
                <xpath>"some xpath"</xpath>
                <value>someValue2</value>
                <tagName>none1</tagName>
            </test>
            <test id="test003">
                <xpath>"some xpath"</xpath>
                <value>someValue3</value>
                <tagName>none2</tagName>
            </test>
        </Event_1>
        </Events>
        </Config>

到目前为止,我所做的是:

 string EventCode="Event_1";
var doc= XDocument.Load(@"C:\new\test\testConfig.xml");
var result = from y in doc.Descendants(EventCode).
 Where(y =>(string)y.Element("path").Attribute("id")=="test001"
                     {
                         NameOfEvent = y.Element("NameOfEvent").Value,
                         xpath= y.Element("test").Element("xpath").Value
                         value =y.Element("test").Element("value").Value,
                         tag =y.Element("test").Element("tagName").Value
                     };

比,我想使用foreach循环来访问所有测试元素。但是,我只能访问第一个元素测试的chiled节点。 你能帮帮忙吗?非常感谢提前!!!

1 个答案:

答案 0 :(得分:1)

假设您的XML没有特定的命名空间

var evt = (from el in doc.Descendants("test")
           where el.Parent.Name == "Event_1"
           group el by el.Parent.Element("NameOfEvent").Value into g
           select new {
               Name = g.Key,
               Tests = g.Select(x => new {
                   XPath = x.Element("xpath").Value,
                   Value = x.Element("value").Value,
                   TagName = x.Element("tagName").Value
               })
           }).FirstOrDefault();

Console.WriteLine("Event name: " + evt.Name);
foreach (var test in evt.Tests)
{
    Console.WriteLine(test.XPath);
    Console.WriteLine(test.Value);
    Console.WriteLine(test.TagName);
}

Live demo