我试图找出解决我遇到的一个小问题的方法,但过去两天我没有取得多大成功。我在这里经历了很多帖子,但我没有为自己找到合适的解决方案。我知道这对你们来说可能是个基本问题,但似乎我已经失去了关注,并且可以清楚地思考这个问题。
所以,这就是问题所在。我在下面有一个示例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节点。 你能帮帮忙吗?非常感谢提前!!!
答案 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);
}