2009-01-27 145 views
3

读取XML文件并获取确切的节点文本非常容易,但是如何使用新值更新该节点?如何更新XML节点?

阅读:

public static String GetSettings(SettingsType type, SectionType section) 
{ 
    XmlTextReader reader = new XmlTextReader(HttpContext.Current.Request.MapPath(APPSETTINGSPATH)); 
    XmlDocument document = new XmlDocument(); 
    document.Load(reader); 

    XmlNode node = document.SelectSingleNode(
         String.Format("/MyRootName/MySubNode/{0}/{1}", 
         Enum.Parse(typeof(SettingsType), type.ToString()), 
         Enum.Parse(typeof(SectionType), section.ToString())));  
    return node.InnerText; 
} 

写的......?

public static void SetSettings(SettingsType type, SectionType section, String value) 
{ 
    try 
    { 
     XmlTextReader reader = new XmlTextReader(HttpContext.Current.Request.MapPath(APPSETTINGSPATH)); 
     XmlDocument document = new XmlDocument(); 
     document.Load(reader); 

     XmlNode node = document.SelectSingleNode(
          String.Format("/MyRootName/MySubNode/{0}/{1}", 
          Enum.Parse(typeof(SettingsType), type.ToString()), 
          Enum.Parse(typeof(SectionType), section.ToString()))); 
     node.InnerText = value; 
     node.Update(); 
    } 
    catch (Exception ex) 
    { 
     throw new Exception("Error:", ex); 
    } 
} 

行,node.Update();不存在,但这就是我想要的:)

我看到了XmlTextWriter对象,但它会将整个XML写入一个新文件,并且我只需要在原始Node中更新一个值,我可以另存为一个新的文件,然后将新文件重命名为原始名称,但是......它必须更简单才能做到这一点?

你们中的任何一个人都有一个示例代码即将做到这一点?

谢谢

回答

8

您不需要“更新”方法 - 设置InnerText属性更新它。但是,它仅在内存中应用更新。你虽然需要重写整个文件 - 你不能只更新它的一小部分(至少,没有lot的工作,没有开箱即用的支持)。

3

XmlDocument.Load具有过载,所以没有必要为读者,将直接把文件名。

同样,当你完成XmlDocument.Save将采取一个文件名,它将保存该文件。

+0

无论如果我使用读取器或过载的方法,我将最终具有:“该进程无法访问文件'C:\ MyWebsite \ appAuthentication.xml',因为它正在被另一个进程使用。”当我使用document.WriteTo(writer)时, – balexandre 2009-01-27 11:07:59

+0

甚至document.Save(作家); – balexandre 2009-01-27 11:09:01

1

您正在更新内存中的节点表示xml文档,AFAIK无法直接在物理文件中更新节点。您必须将其全部转储回文件。

2

nodeValue属性可用于更改文本节点的值。

下面的代码改变第一元素的文本节点值: 示例:

xmlDoc=loadXMLDoc("books.xml"); 

x=xmlDoc.getElementsByTagName("title")[0].childNodes[0]; 
x.nodeValue="Easy Cooking"; 

源:http://www.w3schools.com/DOM/dom_nodes_set.asp