Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在XML中找到所有子节点_C#_Xml_Xpath - Fatal编程技术网

C# 如何在XML中找到所有子节点

C# 如何在XML中找到所有子节点,c#,xml,xpath,C#,Xml,Xpath,我正在尝试获取下面示例中的所有子页面。XML如下所示(简单布局) 我试图创建以下内容,但它只找到第一个“子页面” XmlDocument doc=新的XmlDocument(); doc.Load(路径+@“\config.xml”); XmlNodeList groups=doc.SelectNodes(“主/组”); foreach(组中的XmlNode组) { 字符串groupTitle=group.Attributes[“title”].InnerText; String group

我正在尝试获取下面示例中的所有子页面。XML如下所示(简单布局)


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

XmlDocument doc=新的XmlDocument();
doc.Load(路径+@“\config.xml”);
XmlNodeList groups=doc.SelectNodes(“主/组”);
foreach(组中的XmlNode组)
{
字符串groupTitle=group.Attributes[“title”].InnerText;
String groupEnabled=group.Attributes[“enabled”].InnerText;
maxResults=Convert.ToInt32(group.Attributes[“maxResults”].InnerText);
如果(groupEnabled==“True”)
{
firstGroup.Title=groupTitle;
XmlNodeList pages=group.SelectNodes(“页面”);
foreach(页中的XmlNode页)
{
字符串pageTitle=page.Attributes[“title”].InnerText;
int pageId=Convert.ToInt32(page.Attributes[“pageId”].InnerText);
String subtitle=page.Attributes[“subtitle”].InnerText;
字符串pageEnabled=page.Attributes[“enabled”].InnerText;
如果(pageEnabled==“True”)
{
添加(新的PageItem(pageId、pageTitle、subtitle));
pageList.Add(pageId);
XmlNodeList子页面=页面。选择节点(“子页面”);
foreach(子页面中的XmlNode子页面)
{
string subpageTitle=subpage.Attributes[“title”].InnerText;
int subpageId=Convert.ToInt32(subpage.Attributes[“pageId”].InnerText);
String subpageSubtitle=subpage.Attributes[“subtitle”].InnerText;
String subpage enabled=subpage.Attributes[“enabled”].InnerText;
如果(子页面启用==“真”)
{
添加(subpageId,新元组(pageId,subpageTitle,subpageSubtitle));
}
}
}
}
}
}
我做错了什么?我只想浏览子页面下面的所有子页面,并获得可用的属性


提前感谢。

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

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
IEnumerable de=
来自xmlTree.subgrade中的el(“子页面”)
选择el;
foreach(在de中的XElement el)
Console.WriteLine(el.Attributes(“标题”)、el.Attributes(“页面ID”)//等
这个怎么样

        string path = @"..\LinqToXml\LinqToXml\config.Xml";

        XElement doc2 = XElement.Load(path);

         var element = from t in doc2.Elements("group").Elements("page").Descendants() select t;

        foreach (var el in element)
        {
            if (el.HasAttributes)
            {
                foreach (var att in el.Attributes())
                {
                    Debug.WriteLine(att.Value);
                }
            }
        }
可以尝试使用XPATH:

XmlDocument document = ...;
var nodes = document.SelectNodes("//subpage");
节点
将包含以下集合:

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

转换为XElement后,可以使用方法和“//”来选择具有特定名称的所有元素

using System.Xml.XPath;

...

var path = "<Your path>";
var doc = XElement.Load(path);

var subPages = doc.XPathSelectElements("//subpage[@pageId != '']")
                  .Select(x => new
                               {
                                   Id = Convert.ToInt32(x.Attribute("pageId").Value,
                                   SubTitle = x.Attribute("subtitle").Value,
                                   Enabled = Convert.ToBoolean(x.Attribute("enabled").Value)
                               }
                  )
                  .ToDictionary(u => u.Id, u => new Tuple<int, string, string>(u.Id, u.SubTitle, u.Enabled)
使用System.Xml.XPath;
...
var路径=”;
var doc=XElement.Load(路径);
var subpage=doc.XPathSelectElements(“//subpage[@pageId!=''”)
.选择(x=>new
{
Id=Convert.ToInt32(x.Attribute(“pageId”).值,
SubTitle=x.属性(“SubTitle”).值,
Enabled=Convert.ToBoolean(x.Attribute(“Enabled”).Value)
}
)
.ToDictionary(u=>u.Id,u=>newtuple(u.Id,u.SubTitle,u.Enabled)

您的问题就在这里

XmlNodeList subpages = page.SelectNodes("subpage"); 
XmlNodeList subpages = page.SelectNodes(".//subpage"); 
子页面
仅包含
页面
中包含的元素的子
子页面
元素

但是,您需要
页面
的所有子体

解决方案

XmlNodeList subpages = page.SelectNodes("subpage"); 
XmlNodeList subpages = page.SelectNodes(".//subpage"); 
将上述行替换为以下内容:

XmlNodeList subpages = page.SelectNodes("subpage"); 
XmlNodeList subpages = page.SelectNodes(".//subpage"); 

变量
子页面
现在包含当前节点
页面
的所有
子页面
子页面

问题可能是子页面是嵌套的。尝试使用递归循环嵌套子页面。嗨,Krizz,嗯,好的,有没有更简单的方法来进行此布局。我希望能够有多个页面节点和子页面,但是如果需要的话,一个子页面也应该有子页面,子页面,子页面。有什么想法吗;)pistipanko,你有没有一个例子可以在我当前的代码示例中帮助我:)thx inadvance@cptricochceck我的最新答案这将只获得顶级
子页面
元素(使用示例中的4个),而不是全部元素(10,同样来自示例).不,我想它会返回所有子页面元素,包括顶级元素。它不会获取相关页面元素的信息,但当查看问题中的代码片段时,我不确定是否需要它。不,它会返回所有子页面元素。请看。这比我所看到的任何其他代码都要简单得多ere:-)谢谢你的例子,也许我以后会改成LINQ;-)好吧,如果你觉得它有用的话,请给我的评论投赞成票。自从我皈依林克,我就再也没有回头。它比基于DOM或XPath的方法简单得多。您可以使用它选择所有内容,而不仅仅是
子页面
元素。感谢您的快速回复。如果很难做到,您是否认为将我的xml更改为其他格式会更好。或只需要能够支持多个子级别。(恶心)你知道我应该怎么做才能把它全部解析出来吗坚持你的格式,看看我关于使用LINQ到XML的答案。相信我,它会工作的。注意:假设XML中也存在“subtitle”和“enabled”属性,并且没有安全地确认“pageId”和“enabled”属性值解析为预期类型,这有点不安全。我将把这部分留给你…谢谢你的例子:)非常有帮助。谢谢你非常清晰的回答,这是你的问题,这是你解决它的方式,我喜欢这个。非常感谢。它现在正按我所希望的那样工作。