首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何查找XML中的所有子节点

如何查找XML中的所有子节点
EN

Stack Overflow用户
提问于 2012-02-20 05:06:59
回答 5查看 356关注 0票数 3

我正在尝试获取下面示例中的所有子页面。XML看起来像这样(简单的布局)

代码语言:javascript
复制
<?xml version="1.0"?>

<main> 
  <group  title="Server Tools" enabled="True">
    <page title="Server Tools" pageId="1" subtitle="Tools for servers" enabled="True">
      <subpage title="Name-1" pageId="2" subtitle="" enabled="True">        
        <subpage title="Name-2" pageId="3" subtitle="" enabled="True">
            <subpage title="Name-3" pageId="4" subtitle="" enabled="True">
                <subpage title="Name-4" pageId="5" subtitle="" enabled="True">                  
                </subpage>
            </subpage>
        </subpage>
      </subpage>
    </page> 
  </group>
</main>

我尝试创建以下内容,但它只找到第一个“子页面”。

代码语言:javascript
复制
XmlDocument doc = new XmlDocument();
doc.Load(path + @"\config.xml");

XmlNodeList groups = doc.SelectNodes("main/group");
foreach (XmlNode group in groups)
{
    String groupTitle = group.Attributes["title"].InnerText;
    String groupEnabled = group.Attributes["enabled"].InnerText;
    maxResults = Convert.ToInt32(group.Attributes["maxResults"].InnerText);

    if (groupEnabled == "True")
    {
       firstGroup.Title = groupTitle;
       XmlNodeList pages = group.SelectNodes("page");

       foreach (XmlNode page in pages)
       {
          String pageTitle = page.Attributes["title"].InnerText;
          int pageId = Convert.ToInt32(page.Attributes["pageId"].InnerText);
          String subtitle = page.Attributes["subtitle"].InnerText;
          String pageEnabled = page.Attributes["enabled"].InnerText;

          if(pageEnabled == "True")
          {
             firstGroup.Items.Add(new PageItem(pageId, pageTitle, subtitle));
             pageList.Add(pageId);
             XmlNodeList subpages = page.SelectNodes("subpage");

             foreach (XmlNode subpage in subpages)
             {
                string subpageTitle = subpage.Attributes["title"].InnerText;
                int subpageId = Convert.ToInt32(subpage.Attributes["pageId"].InnerText);
                String subpageSubtitle = subpage.Attributes["subtitle"].InnerText;
                String subpageEnabled = subpage.Attributes["enabled"].InnerText;

                if (subpageEnabled == "True")
                {
                   subpageDic.Add(subpageId, new Tuple<int, string, string>(pageId, subpageTitle, subpageSubtitle));
                }
             }
          }
       }
    }
 }

我做错了什么?我只想通过下面的所有子页面,并获得可用的属性。

提前谢谢。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-02-20 06:40:39

你的问题在这里

代码语言:javascript
复制
XmlNodeList subpages = page.SelectNodes("subpage"); 

subpages只包含page中包含的元素的子subpage元素。

但是,您想要page的所有后代。

解决方案

用以下替换上一行

代码语言:javascript
复制
XmlNodeList subpages = page.SelectNodes(".//subpage"); 

变量subpages现在包含当前节点page的所有subpage后代。

票数 1
EN

Stack Overflow用户

发布于 2012-02-20 05:47:01

也许可以尝试使用XPATH:

代码语言:javascript
复制
XmlDocument document = ...;
var nodes = document.SelectNodes("//subpage");

nodes将包含以下集合:

代码语言:javascript
复制
<subpage title="Name-1" pageId="2" subtitle="" enabled="True">        
    <subpage title="Name-2" pageId="3" subtitle="" enabled="True">
        <subpage title="Name-3" pageId="4" subtitle="" enabled="True">
                <subpage title="Name-4" pageId="5" subtitle="" enabled="True">                  
                </subpage>
            </subpage>
        </subpage>
    </subpage>
<subpage title="Name-2" pageId="3" subtitle="" enabled="True">
    <subpage title="Name-3" pageId="4" subtitle="" enabled="True">
    <subpage title="Name-4" pageId="5" subtitle="" enabled="True">                  
</subpage>

现在,对于nodes中的每个节点,递归地选择//subpage

编辑:

XPATH是一个强大的工具。尝试使用xpath://../subpage。结果是:

代码语言:javascript
复制
<subpage title="Name-1" pageId="2" subtitle="" enabled="True">        
        <subpage title="Name-2" pageId="3" subtitle="" enabled="True">
            <subpage title="Name-3" pageId="4" subtitle="" enabled="True">
                <subpage title="Name-4" pageId="5" subtitle="" enabled="True">                  
                </subpage>
            </subpage>
        </subpage>
    </subpage>
-----------------------
<subpage title="Name-2" pageId="3" subtitle="" enabled="True">
    <subpage title="Name-3" pageId="4" subtitle="" enabled="True">
        <subpage title="Name-4" pageId="5" subtitle="" enabled="True">                  
        </subpage>
    </subpage>
</subpage>
-----------------------
<subpage title="Name-3" pageId="4" subtitle="" enabled="True">
    <subpage title="Name-4" pageId="5" subtitle="" enabled="True">                  
    </subpage>
</subpage>
-----------------------
<subpage title="Name-4" pageId="5" subtitle="" enabled="True">
</subpage>
票数 2
EN

Stack Overflow用户

发布于 2012-02-20 05:14:14

忘记XMLDocument,改用LINQ to XML。一旦使用XDocument.Load()加载了文档,就可以使用如下代码

代码语言:javascript
复制
IEnumerable<XElement> de=
    from el in xmlTree.Descendants("subpage")
    select el;
    foreach (XElement el in de)
Console.WriteLine(el.Attributes("title"), el.Attributes("pageID"));//etc
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9353239

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档