【问题标题】:How to Update a XML Node?如何更新 XML 节点?
【发布时间】:2009-01-27 11:00:30
【问题描述】:

读取 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 中的一个值,我可以另存为新文件,然后将新文件重命名为原始文件名称,但是...这样做必须更简单吗?

你们中的任何人都有一个示例代码来做这件事吗?

谢谢

【问题讨论】:

    标签: c# asp.net xml


    【解决方案1】:

    您不需要“更新”方法 - 设置 InnerText 属性会更新它。但是,它仅在内存中应用更新。你确实需要重写整个文件 - 你不能只更新它的一小部分(至少,不是没有很多的工作并且没有超出- 盒装支持)。

    【讨论】:

    • 所以,即使我在 web.config 中使用 AppConfig,我也永远无法将实际结果(文本)保存到变量中,只能保存在内存中,对吗 Jon?
    • “将实际结果保存到变量中”是什么意思?哪些变量?
    • 当我打开 xml 文件时,我只能将更改“保存在内存中”,我没有看到任何更改,这对问题中的示例和使用 ConfigurationManager.AppSettings [. ..] 在 web.config 文件中使用 区域。
    • 如果我只在 Web.Config 文件中使用 AppConfig 部分,这是真的! :)
    • Jon 的意思是,当您加载有问题的 XML 文档时,它会加载到应用程序的内存中。对节点的任何更新都保留在内存负载中。直到您将 XML 写回文件,并且您的应用程序检测到文件更改,这些更改才会传播给用户。
    【解决方案2】:

    XmlDocument.Load 有一个重载,将直接获取文件名,因此不需要阅读器。

    类似地,当您完成时,XmlDocument.Save 将获取一个文件名,它将保存文档。

    【讨论】:

    • 无论我使用阅读器还是重载方法,我最终都会遇到:“进程无法访问文件'C:\MyWebsite\appAuthentication.xml',因为它正在被另一个人使用process."当我使用 document.WriteTo(writer);
    • 甚至是document.Save(writer);
    【解决方案3】:

    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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-24
        • 2013-03-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多