C# C语言中的XML Lambda查询

C# C语言中的XML Lambda查询,c#,.net,C#,.net,我有一个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> <N

我有一个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>
如果在XmlDocument对象上使用Lambda表达式或Linq To XML更合适,如何执行以下操作:

获取特定元素的文本,例如GROUP=1的NAME文本 元素名称第一次出现的值
非常感谢

我只听懂了你的第一个问题。这是第一个:

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


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

我只懂你的第一个问题。这是第一个:

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


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

我使用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();

我使用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();
假设您指的是XDocument而不是XMLDCument:

第一个问题:

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();
我真的不明白第二个问题。。。yuo所说的包含该名称的元素是什么意思?哪个名字?如果你正在检查名字是否等于一个给定的名字,你难道还不知道这个名字吗?您是指特定名称的组值吗?如果是这样,很容易:

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元素都有一个GROUP和NAME子元素。如果不是这样,请告诉我们。

假设您指的是XDocument而不是XMLDCount:

第一个问题:

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();
我真的不明白第二个问题。。。yuo所说的包含该名称的元素是什么意思?哪个名字?如果你正在检查名字是否等于一个给定的名字,你难道还不知道这个名字吗?您是指特定名称的组值吗?如果是这样,很容易:

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元素都有一个GROUP和NAME子元素。如果不是这样,请告诉我们。

您确定这是一个XML文档吗?使用LINQ更容易使用XDocument。您确定它是XmlDocument吗?使用LINQ更容易使用XDocument。您应该像我在回答中所做的那样定义名称空间并使用它,如.Elementsns+MY_GROUP等。@lassespeholt:我现在已经这样做了。但是,使用字符串的名称空间转换更为惯用——正如使用显式转换而不是int.Parse等+1是的,我已经注意到了这一点。谢谢你改进我的代码。。。最好的回答是你应该像我在回答中那样定义名称空间并使用它,比如.Elementsns+MY_GROUP等等。@lassespeholt:我现在已经这样做了。但是,使用字符串的名称空间转换更为惯用——正如使用显式转换而不是int.Parse等+1是的,我已经注意到了这一点。谢谢你改进我的代码。。。顺致敬意,