2010-08-17 98 views
1

我在格式XmlDocument对象和xml:在XmlDocument的XML拉姆达查询

<?xml version="1.0" encoding="utf-8"?> 
<S xmlns="http://server.com/DAAPI"> 
    <TIMESTAMP>2010-08-16 17:25:45.633</TIMESTAMP> 
    <MY_GROUP> 
     <GROUP>1 </GROUP> 
     <NAME>Amsterdam</NAME> 
     .... 
    </MY_GROUP> 
    <MY_GROUP> 
     <GROUP>2 </GROUP> 
     <NAME>Ireland</NAME> 
     .... 
    </MY_GROUP> 
    <MY_GROUP> 
     <GROUP>3 </GROUP> 
     <NAME>UK</NAME> 
     .... 
    </MY_GROUP> 

使用Lambda表达式(或LINQ到XML,如果它是比较合适的)反对我如何能做到以下:

  1. 获取特定元素的文本,说NAME的文本,其中GROUP = 1
  2. 元素“NAME”
中第一次出现的值

非常感谢

+1

你确定它是一个'XmlDocument'吗?使用LINQ可以更方便地使用'XDocument'。 – Abel 2010-08-17 08:20:29

回答

0

我已经使用Linq XML。

string input = "<?xml version=\"1.0\" encoding=\"utf-8\"?><S xmlns=\"http://server.com/DAAPI\"><TIMESTAMP>2010-08-16 17:25:45.633</TIMESTAMP><MY_GROUP><GROUP>1 </GROUP><NAME>Amsterdam</NAME>....</MY_GROUP><MY_GROUP><GROUP>2 </GROUP><NAME>Ireland</NAME>....</MY_GROUP><MY_GROUP><GROUP>3 </GROUP><NAME>UK</NAME>....</MY_GROUP></S>"; 

var doc = XDocument.Parse(input); 

XNamespace ns = "http://server.com/DAAPI"; 

//The first question 
var name = (from elem in doc.Root.Elements(ns + "MY_GROUP") 
      where elem.Element(ns + "GROUP") != null //Checks whether the element actually exists - if you KNOW it does then it can be removed 
       && (int)elem.Element(ns + "GROUP") == 1 //This could fail if not an integer - insure it is if nessasary 
      select (string)elem.Element(ns + "NAME")).SingleOrDefault(); 
0

我只理解你的第一个问题。这里你是第一个:

var xmlSource = myGroup.Load(@"../../MyGroup.xml"); 


var q = from c in xmlSource.myGroup 
     where c.group = 1 
     select c.name; 
1

假设你的意思XDocument而不是XmlDcoument

第一个问题:

XNamespace ns = "http://server.com/DAAPI"; 
string text = (from my_group in doc.Elements(ns + "MY_GROUP") 
       where (int) my_group.Element(ns + "GROUP") == 1 
       select (string) my_group.Element(ns + "NAME")).First(); 

我真的不明白第二个问题......做什么用宥的意思是“包含的元素那个名字“?哪个名字?如果你正在检查NAME等于一个给定的名字,你不知道那个名字吗?您是否意指GROUP的特定名称的价值?如果是的话,很容易:

XNamespace ns = "http://server.com/DAAPI"; 
int group = (from my_group in doc.Elements(ns + "MY_GROUP") 
      where (string) my_group.Element(ns + "NAME") 
      select (int) my_group.Element(ns + "GROUP")).First(); 

这些查询的两个假设确实存在的价值,并且每个MY_GROUP元素有一个组并将其命名子元素。如果情况并非如此,请告诉我们。

+0

您应该已经定义了命名空间并像使用它一样.Elements(ns +“MY_GROUP”)等等,正如我在我的答案中所做的那样。 – 2010-08-17 08:26:42

+0

@lasseespeholt:我现在这样做了。但是使用字符串的命名空间转换更具惯用性 - 正如使用显式转换而不是int.Parse等。 – 2010-08-17 08:27:55

+0

+1是的,我已经注意到了。感谢您改善我的代码...最好的问候 – 2010-08-17 08:30:35