Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.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# 在C中遍历XML样式的站点地图文件#_C#_Xml_Sitemap - Fatal编程技术网

C# 在C中遍历XML样式的站点地图文件#

C# 在C中遍历XML样式的站点地图文件#,c#,xml,sitemap,C#,Xml,Sitemap,我所要做的就是把我的MySite.sitemap文件从中取出所有节点,然后打印到一个文件中。长期目标是获取每个节点,看看它是父节点还是子节点 MySite.sitemap 如果有人能帮我弄清楚下一个问题是,一旦我列举了每个节点,我能进入每个节点并根据每个节点内的内容进行逻辑分析吗?IE节点a具有节点b不具有的角色。要使用,需要明确指定名称空间(而不是XML文件中的名称空间前缀)和名称: XmlNamespaceManager ns = new XmlNamespaceManage

我所要做的就是把我的MySite.sitemap文件从中取出所有节点,然后打印到一个文件中。长期目标是获取每个节点,看看它是父节点还是子节点

MySite.sitemap 如果有人能帮我弄清楚下一个问题是,一旦我列举了每个节点,我能进入每个节点并根据每个节点内的内容进行逻辑分析吗?IE节点a具有节点b不具有的角色。

要使用,需要明确指定名称空间(而不是XML文件中的名称空间前缀)和名称:

        XmlNamespaceManager ns = new XmlNamespaceManager(xml.NameTable);
        ns.AddNamespace("myPrefix", @"http://schemas.microsoft.com/AspNet/SiteMap-File-1.0");

        var topNodes = xml.SelectNodes("/myPrefix:siteMap/myPrefix:siteMapNode", ns);
        var allNodes = xml.SelectNodes("//myPrefix:siteMapNode", ns);
这里,查询字符串中的文本
“myPrefix”
是对命名空间的查找,该命名空间是通过调用
ns.AddNamespace(“myPrefix”,…)
添加的。这只是对您自己创建的本地表的查找

要将所有节点输出到文件,可以执行以下操作:

        foreach (XmlNode node in allNodes)
        {
            var text = new string(' ', node.AncestorsAndSelf().Count() - 1) + "Node: " + string.Join(", ", node.Attributes.Cast<XmlAttribute>().Select(a => a.Name + ": " + a.Value).ToArray());
            file.WriteLine(text);
        }
顺便说一句,初始查询看起来简单得多,使用:


你想要所有的
siteMapNode
节点,还是只想要顶级节点?
siteMapNode
从现在开始,但最好是所有节点。有点尴尬,但是,我怎么知道我的前缀是什么?或者这就是我想要的?我可以像你的例子一样输入“myPrefix”,它会起作用…?@gh0st-使用任何你想要的前缀,只要确保传递给
AddNamespace
的前缀与你在查询字符串中使用的前缀相同即可。我怀疑微软设计了它的API,所以我们不能从XML文件中硬编码前缀,所以必须使用实际的名称空间。根据你的建议,循环至少现在可以运行了。但是仍然不打印
节点.InnerText
。我希望至少能够从节点中获取URL。@gh0st-这些节点没有文本值;只有属性和孩子。您希望在您的文件中看到什么?我是否可以从中提取
标题
url
?例如,在我的原始问题中,我有一个带有
title=“Child 1”
的节点,我是否可以提取该节点并将其打印到我的调试文件中?或者URL字段,或者全部?
        XmlNamespaceManager ns = new XmlNamespaceManager(xml.NameTable);
        ns.AddNamespace("myPrefix", @"http://schemas.microsoft.com/AspNet/SiteMap-File-1.0");

        var topNodes = xml.SelectNodes("/myPrefix:siteMap/myPrefix:siteMapNode", ns);
        var allNodes = xml.SelectNodes("//myPrefix:siteMapNode", ns);
        foreach (XmlNode node in allNodes)
        {
            var text = new string(' ', node.AncestorsAndSelf().Count() - 1) + "Node: " + string.Join(", ", node.Attributes.Cast<XmlAttribute>().Select(a => a.Name + ": " + a.Value).ToArray());
            file.WriteLine(text);
        }
public static class XmlNodeExtensions
{
    public static IEnumerable<XmlNode> AncestorsAndSelf(this XmlNode node)
    {
        for (; node != null; node = node.ParentNode)
            yield return node;
    }
}
 Node: title: Grand Parent 1, roles: Grand Parent Role, description: A simple description that I might want to write to the text file.
   Node: title: Parent, description: , roles: Parent Role
    Node: title: Child 1, url: linkToPage.aspx, description: A short description.
    Node: title: Child 2, url: linkToPage2.aspx, description: Another short description.
   Node: title: Parent 2, description: , roles: Parent Role
    Node: title: Child 3, url: linkToPage3.aspx, description: A short description.
    Node: title: Child 4, url: linkToPage4.aspx, description: Another short description.
        var xDoc = XDocument.Load(pathToSiteMapFile + siteMapFile);

        var topElements = xDoc.Root.Elements(xDoc.Root.Name.Namespace + "siteMapNode");
        var allElements = xDoc.Root.Descendants(xDoc.Root.Name.Namespace + "siteMapNode");