C# 按标题查找节点并将其删除,但总是先删除第一个节点-asp.net
在我的Web.sitemap中,我有以下内容: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
<?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;
}
}
}