如何使用xmltextreader或xmlreader解析和更新xml文件

时间:2011-09-15 06:14:37

标签: asp.net xml xmlreader xmltextreader

您好我有以下代码来读取xml文件并更改特定节点的值,但我想使用xmltextreader或xmlreader执行相同操作,我试图避免使用语句doc.Save(System.Web.HttpContext.Current.Server.MapPath("Data/Example.xml"));,它有一个直接引用我的物理文件。

XmlDocument doc = new XmlDocument();
                   string xmlFile = System.Web.HttpContext.Current.Server.MapPath("Data/Example.xml");
                   doc.Load(xmlFile);
                   XmlNodeList xmlnode = doc.GetElementsByTagName("value");
                   xmlnode[0].ChildNodes[0].Value = 23;
 doc.Save(System.Web.HttpContext.Current.Server.MapPath("Data/Example.xml"));

2 个答案:

答案 0 :(得分:2)

某些东西必须要有对该文件的引用。但是,您可以轻松地将代码更改为只接受Stream(必须是可读,可写和可搜索的):

private static void ChangeDocument(Stream stream)
{
    XmlDocument doc = new XmlDocument();
    doc.Load(stream);
    XmlNodeList xmlnode = doc.GetElementsByTagName("value");
    xmlnode[0].ChildNodes[0].Value = 23;
    stream.Position = 0;
    doc.Save(stream);
    stream.SetLength(stream.Position); // Truncate the file if it was longer
}

这有点难看,不可否认......

当然你总是可以传递文件名本身 - 你的MapPath调用仍然是更高级别的方法,这可能就是你想要实现的目标:

private static void ChangeDocument(string filename)
{
    XmlDocument doc = new XmlDocument();
    doc.Load(filename);
    XmlNodeList xmlnode = doc.GetElementsByTagName("value");
    xmlnode[0].ChildNodes[0].Value = 23;
    doc.Save(filename);
}

最后一个 - 如果你使用的是.NET 3.5或更高版本,我强烈建议使用LINQ to XML作为一个更好的XML API。

答案 1 :(得分:1)

您无法使用 XmlTextReader XmlReader ansectors编写或更新XML数据,使用 XmlTextWriter XmlWriter 祖先,ot XmlSerializer.Serialize(..)方法作为替代。

你无法避免这种说法,等等,

doc.Save(System.Web.HttpContext.Current.Server.MapPath("Data/Example.xml"));

直接引用您的物理文件,因为您必须再次将已更改的节点写回源文件,否则您必须使用基于文件的方法切换系统(ASP.NET网站使用文件 - 基于数据存储)到数据库驱动的方法(使用数据库服务器的ASP.NET网站)。

另外,在SQL服务器中使用自己的XML数据,然后使用ORM的EF加载和更新它。