您好我有以下代码来读取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"));
答案 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加载和更新它。