【问题标题】:How to parse and update xml file using xmltextreader or xmlreader如何使用 xmltextreader 或 xmlreader 解析和更新 xml 文件
【发布时间】:2011-11-17 14:26:36
【问题描述】:

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

【问题讨论】:

  • +1 但问题看起来不合时宜,使用 reader 无法保存任何东西,这让我想起了我对英语的不好了解.

标签: asp.net xml xmlreader xmltextreader


【解决方案1】:

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

【讨论】:

  • 隐藏 doc.Save(...) 的棘手方法?
  • 那么文件的完整路径将在您声明 Stream 对象的另一个代码中,无论如何,使用基于文件的方法是不可避免的
  • @Artur:是的,如果您想访问一个文件,您将需要在某处知道该名称。我假设 OP 不希望它在 here 中计算,这很可能是完全合理的。 (例如,此代码可以放入多个应用程序中使用的类库中,Server.MapPath 可能不合适。)
  • 真的有必要拥有 doc.Save,我可以用任何其他好的方法更新我的 xml 文件吗?
  • @mahesh:嗯,必须知道如何写回文件。你可以传入一个Func<XmlWriter> - 或者如果你愿意写入一个不同的 文件,你可以传入一个XmlWriter 开始。如果您确切地说出您在此处要避免的内容,那将会有所帮助。为什么不喜欢doc.Save
【解决方案2】:

您不能使用 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 加载和更新它。

【讨论】:

    猜你喜欢
    • 2020-08-19
    • 2013-02-27
    • 2016-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多