2013-08-19 2 views
0

У меня есть XML-документ:.LINQ XML выберите узел

<users> 
     <user_tuple> 
      <userid>U01</userid> 
      <code> 
      <name>Tom Jones</name> 
      </code> 
      <rating>B</rating> 
     </user_tuple> 
     <user_tuple> 
      <userid>U02</userid> 
      <code> 
      <name>Mary Doe</name> 
      </code> 
      <rating>A</rating> 
     </user_tuple> 
     <user_tuple> 
      <userid>U03</userid> 
      <code> 
      <name>Dee Linquent</name> 
      </code> 
     <rating>D</rating> 
     </user_tuple> 

Как выбрать только те (и все дочерние узлы/элементы), где элемент ("UserID") значение == "U01" и Element (. "имя") Значение == "Том Джонс" и т.д. то есть я хочу результаты:

<user_tuple> 
     <userid>U01</userid> 
     <code> 
     <name>Tom Jones</name> 
     </code> 
     <rating>B</rating> 
    </user_tuple> 

Я использую C#

public void searchInfo(string rootNode, string Element1Name, string Element2Name, string Element1Val, string Element2Val){ 

////// Select rootNode and all descend nodes 

    var res = root.Elements("rootNode") 
     .Where(
      x => 
      (string)x.Element(Element1Name) == Element1Val&& 
      (string)x.Element(Element2Name) == Element2Val) 
     ).ToList(); 
///////////  

foreach (var node in res){ 
Debug.Writeline("Name {0} Value {1}", node.Name, node.Value) 

} 

Пример:

searchInfo ("RootNode", "USERID", "код", "U01", "Том Джонс")

res = <userid>U01</userid> 
      <code> 
      <name>Tom Jones</name> 
      </code> 
      <rating>B</rating> 

and result: 
userid U01 
name Tom Jones 
rating B 

Возможно ли это?

+0

Не могли бы вы уточнить, работаете ли вы в C# или Visual Basic? Linq доступен в обоих вариантах. На самом деле, на мой взгляд, несколько операций с XML проще в VB, чем на C#. – Katana314

ответ

1

попробовать этот

var doc = XDocument.Parse(s); 
var res = doc.Elements("users").Elements("user_tuple") 
    .Where(
     x => 
     (string)x.Element("userid") == "U01" && 
     (string)x.Element("code").Element("name") == "TomJones") 
    ).ToList(); 

Или использовать XPath:

var res = doc.XPathSelectElements(" 
       users/user_tuple[userid='U01' and code[name='TomJones']] 
      ").ToList(); 
+0

Вам нужно указать потомков? – smiggleworth

+0

'doc.Descendants(). Где ...' действительно?!?! Это заставит запрос выполнить огромное количество ненужной работы ... – MarcinJuraszek

+0

@MarcinJuraszek вы правы, лучше использовать 'doc.Elements (« users »). Элементы (« user_tuple »)' –

Смежные вопросы