1

嗨,我有以下代码来读取 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"));
4

2 回答 2

2

好吧,有些东西必须引用该文件。但是,您可以轻松地更改代码以简单地接受 a 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。

于 2011-09-15T06:23:48.457 回答
1

您不能使用XmlTextReaderXmlReader ansectors 写入或更新 XML 数据,使用XmlTextWriterXmlWriter祖先,OT XmlSerializer.Serialize(..)方法作为替代。

您无法避免声明等,

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

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

作为替代方案,在 SQL 服务器中使用您自己的 XML 数据,然后使用 ORM 的 EF 加载和更新它。

于 2011-09-15T06:18:43.857 回答