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

さて、何かがファイルへの参照を持っている必要があります。ただし、コードを簡単に変更して、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);
}

最後にもう1つ、.NET 3.5以降を使用している場合は、より優れたXMLAPIとしてLINQtoXMLを使用することを強くお勧めします。

于 2011-09-15T06:23:48.457 に答える
1

XmlTextReaderまたはXmlReaderの祖先を使用してXMLデータを書き込んだり更新したりすることはできません。代わりに、XmlTextWriterまたはXmlWriterの祖先、またはXmlSerializer.Serialize(..)メソッドを使用してください。

あなたは声明などを避けることはできません、

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

物理ファイルを直接参照します。変更したノードを元のファイルに再度書き戻す必要があるため、ファイルベースのアプローチ(ファイルベースのデータストレージを使用するASP.NET Webサイト)の使用からシステムを切り替える必要があります。 )データベース駆動型アプローチ(データベースサーバーを使用するASP.NET Webサイト)。

別の方法として、SQLサーバーで独自のXMLデータを使用し、ORMのEFを使用してデータをロードおよび更新します。

于 2011-09-15T06:18:43.857 に答える