2013-08-19 242 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> 

如何只选择那些(和所有子节点/元素),其中元素(“用户id”)值==“U01”和元素( “名”)值== “汤姆·琼斯” 等即我想要的结果:

<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( “根节点”, “用户id”, “代码”, “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在两个版本都可用。实际上,在我看来,VB中的一些XML操作比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”)' –