有如下xml文件,想根据itemid值如112定位到节点
<MenuItem><text>领导班子</text><url>#</url><itemid>112</itemid></menuitem>
并返回他的父节点的Text值和他兄弟节点的Text值
<Menus>
        <Text>新闻</Text>
        <Url>list.aspx?type=31</Url>
        <ItemID>11</ItemID>
    </MenuItem>
    <MenuItem>
        <Text>政务公开</Text>
        <ItemID>12</ItemID>
        <SubMenu>
          <MenuItem>
           <Text>领导班子</Text>
           <Url>#</Url>
           <ItemID>112</ItemID>
          </MenuItem>
          <MenuItem>
           <Text>机构设置</Text>
           <Url>#</Url>
           <ItemID></ItemID>
          </MenuItem>
          <MenuItem>
           <Text>政务制度</Text>
           <Url>#</Url>
           <ItemID></ItemID>
          </MenuItem>
        </SubMenu>
    </MenuItem>
</Menus>

解决方案 »

  1.   

    XElement xmlPage = XElement.Parse(xml); 
    var query = xmlPage.Descendants("Menus").Where(x=>x.Element("ItemID").Value.Equals("112"));
    select (string)x.Parent.Element("");
    query.Element("").Value; 
      

  2.   

    XmlNode x =doc.SelectSingleNode("/Menus/MenuItem[ItemID='123']");
    兄弟节点
    x.NextSibling 
    x.PreviousSibling http://msdn.microsoft.com/zh-cn/library/system.xml.xmlnode_properties.aspx
      

  3.   

    (1)取出符合条件的MenuItem
    //提取xml中具有指定特征的元素
            private void button1_Click(object sender, EventArgs e)
            {
                
                string str = "<Menus><MenuItem><Text>新闻</Text><Url>list.aspx?type=31</Url><ItemID>11</ItemID></MenuItem>" +
                   "<MenuItem><Text>政务公开</Text><ItemID>12</ItemID><SubMenu><MenuItem><Text>领导班子</Text><Url>#</Url>" +
                   "<ItemID>112</ItemID></MenuItem><MenuItem><Text>机构设置</Text><Url>#</Url><ItemID></ItemID></MenuItem><MenuItem>" +
                   "<Text>政务制度</Text><Url>#</Url><ItemID></ItemID></MenuItem></SubMenu></MenuItem></Menus>";
                
                //从给定的字符串生成xml文档 xele
                XElement xele = XElement.Parse(str);            var subX = from x in xele.Descendants("MenuItem")         //找出若干 MenuItem
                           where x.Element("ItemID").Value.Equals("112")  //这些MenuItem的("ItemID")元素的值必须是112              
                           select x;                                      //选出这样的MenuItem, 放入集合subX
                foreach (var j in subX)                                   //subX中的每个MenuItem
                {
                    richTextBox2.Text = richTextBox2.Text + j.ToString()+",";   //输出到richTextBox2中,之间用逗号隔开
                }        }//效果如下
      

  4.   

     //返回兄弟节点
            private void button1_Click(object sender, EventArgs e)
            {
                
                string str = "<Menus><MenuItem><Text>新闻</Text><Url>list.aspx?type=31</Url><ItemID>11</ItemID></MenuItem>" +
                   "<MenuItem><Text>政务公开</Text><ItemID>12</ItemID><SubMenu><MenuItem><Text>领导班子</Text><Url>#</Url>" +
                   "<ItemID>112</ItemID></MenuItem><MenuItem><Text>机构设置</Text><Url>#</Url><ItemID></ItemID></MenuItem><MenuItem>" +
                   "<Text>政务制度</Text><Url>#</Url><ItemID></ItemID></MenuItem></SubMenu></MenuItem></Menus>";
                
                //从给定的字符串生成xml文档 xele
                XElement xele = XElement.Parse(str);            //先确定<ItemID>112</ItemID>的父节点
                var subX = from x in xele.Descendants("MenuItem")
                           where x.Element("ItemID").Value.Equals("112")
                           select x;            richTextBox2.Text =richTextBox2.Text+"<ItemID>112</ItemID>的兄弟节点是:\n";
                //遍历父节点的所有子节点,返回不是<ItemID>112</ItemID>的所有子节点
                foreach (var u in subX.Descendants())
                {
                    if(u.ToString()!="<ItemID>112</ItemID>")
                    richTextBox2.Text = richTextBox2.Text + u.ToString() + "\n";
                }
               
            }
    //效果如下