C# 按标题查找节点并将其删除,但总是先删除第一个节点-asp.net

C# 按标题查找节点并将其删除,但总是先删除第一个节点-asp.net,c#,asp.net,xml,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

在我的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>
我没有收到任何错误,所以这是正常的,但在sitemap中不是title=“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>


你知道为什么吗?

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

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

这个编译得很好。此外,当运行代码时,它会像预期的那样从文件中删除

看不到您的问题;-)

复制和粘贴的乐趣:

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(节点)上设置断点时也是如此我可以看到Neco节点现在被找到了——当然,因为它很容易被删除


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

返回的节点具有正确的属性,因此我认为这是可以的。(在另一个方法中——UpdateNodeByTitle,它可以工作,所以我认为它一定是可以的)将展示如何使用Linq帮助来实现这一点?
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;
        }
    }
}