2011-03-31 24 views
1

我有這樣的:查找節點的標題,並刪除它,但總是被刪除第一個節點 - 在我Web.sitemap中asp.net

<?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(「尼哥」);

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

而且我沒有得到任何錯誤,所以它是確定的,但在站點地圖的心不是刪除節點與標題=「尼哥」,但總是第一個節點,所以在網站地圖是這樣的:

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

待辦事項你知道爲什麼嗎?

+0

會顯示如何使用Linq做到這一點的幫助? – Sorax 2011-03-31 21:10:27

回答

2

這個編譯就好了。此外,在運行代碼時,它會從文件中刪除<siteMapNode url="Neco" title="Něco" />行,就像它應該的那樣。

無法看到你的問題;-)

對於複印N」粘貼樂趣:

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);設置斷點,當我可以看到,尼哥節點currectly發現 - 好當然,因爲它很容易被刪除。

你知道我在想什麼嗎?由於您正在網絡服務器上運行代碼:請檢查您的編碼!不能強調這一點。您的Neco可能會返回錯誤,請確保您在任何地方使用UTF-8(http頭文件,.sitemap文件中沒有BOM)。

0

這是否編譯?這條線看起來不像。

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

返回的節點有正確的attrs,所以我認爲這是可以的。 (在另一種方法 - UpdateNodeByTitle它的作品,所以我認爲它一定沒問題) – John 2011-03-31 21:09:18