2010-08-17 2 views
1

У меня есть объект XmlDocument и XML в формате:XML Lambda запрос в C#

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

Использование лямбда-выражения (или Linq To XML, если это более уместно) на XmlDocument объект, как я могу сделать следующее :

  1. получить текст определенного элемента, скажем, текст NAME, где GROUP = 1
  2. значения первого вхождения в элементе «NAME»

Большое спасибо

+1

Вы уверены, что это 'XmlDocument'? С LINQ проще использовать 'XDocument'. – Abel

ответ

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

Предполагая, что вы имеете в виду, а не XDocumentXmlDcoument:

Первый вопрос:

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») и т. Д., Как я это делаю в своем ответе. –

+0

@lasseespeholt: Я сделал это сейчас. Но использование преобразования пространства имен из строки более идиоматично - так как использует явные преобразования вместо int.Parse и т. Д. –

+0

+1 Да, я это заметил. Спасибо за улучшение кода ... с наилучшими пожеланиями –