按标题查找节点并将其删除,但始终会删除第一个节点--asp.net

时间:2011-03-31 20:55:10

标签: c# asp.net xml

在我的Web.sitemap中我有这个:

<?xml version="1.0" encoding="utf-8"?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0">
  <siteMapNode url="~/" title="Úvodní stránka">
    <siteMapNode url="Pocitace" title="Počítače" />
    <siteMapNode url="Elektronika" title="Elektronika" />
    <siteMapNode url="Neco" title="Něco" />
  </siteMapNode>
</siteMap>

我叫DeleteNode(“Něco”);

public static void DeleteNode(string title)
{
    XmlDocument doc = LoadXmlDoc();
    XmlElement node = FindNodeByTitle(doc, title);
    node.ParentNode.RemoveChild(node);
    SaveXmlDoc(doc);
}

private static XmlDocument LoadXmlDoc()
{
    XmlDocument doc = new XmlDocument();
    doc.Load(HttpContext.Current.Server.MapPath("../../Web.sitemap"));
    return doc;
}

private static void SaveXmlDoc(XmlDocument doc)
{
    string AbsPath = HttpContext.Current.Server.MapPath("../../Web.sitemap");
    doc.Save(AbsPath);
}

private static XmlElement FindNodeByTitle(XmlDocument doc, string title)
{
    string xPath = String.Format("//*[@title='{0}']", title);
    XmlElement node = doc.SelectSingleNode(xPath) as XmlElement;
    if(node == null)
        throw new Exception("Node not found with title: " + title);
    return node;
}

我没有得到任何错误,所以没关系,但在sitemap中没有删除节点,标题=“Něco”但始终是第一个节点,所以在sitemap中是这样的:

<?xml version="1.0" encoding="utf-8"?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0">
  <siteMapNode url="~/" title="Úvodní stránka">
    <siteMapNode url="Elektronika" title="Elektronika" />
    <siteMapNode url="Neco" title="Něco" />
  </siteMapNode>
</siteMap>

你知道为什么吗?

2 个答案:

答案 0 :(得分:2)

这个编译得很好。此外,在运行代码时,它会从文件中删除<siteMapNode url="Neco" title="Něco" />行。{/ p>

无法看到您的问题; - )

副本n&#39;粘贴乐趣:

using System;
using System.Xml;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            DeleteNode("Něco");
        }

        public static void DeleteNode(string title)
        {
            XmlDocument doc = LoadXmlDoc();
            XmlElement node = FindNodeByTitle(doc, title);
            node.ParentNode.RemoveChild(node);
            SaveXmlDoc(doc);
        }

        private static XmlDocument LoadXmlDoc()
        {
            XmlDocument doc = new XmlDocument();
            doc.Load("C:\\test.xml");
            return doc;
        }

        private static void SaveXmlDoc(XmlDocument doc)
        {
            string AbsPath = "C:\\test.xml";
            doc.Save(AbsPath);
        }

        private static XmlElement FindNodeByTitle(XmlDocument doc, string title)
        {
            string xPath = String.Format("//*[@title='{0}']", title);
            XmlElement node = doc.SelectSingleNode(xPath) as XmlElement;
            if(node == null)
                throw new Exception("Node not found with title: " + title);
            return node;
        }
    }
}

同样在node.ParentNode.RemoveChild(node);处设置断点时,我可以看到Neco节点已经找到 - 当然,因为它很容易被删除。

你知道我的想法吗?由于您在网络服务器上运行代码:检查您的编码!不能强调这一点。您的Neco可能返回错误,请确保您在任何地方使用UTF-8(http标头,文件,.sitemap文件中没有BOM)。

答案 1 :(得分:0)

这会编译吗?这条线看起来不像。

XmlElement node = doc.SelectSingleNode(xPath) as XmlElement;