LINQ-to-XMLにXMLファイルを追加する標準的な方法は、XMLファイルを読み込み、メモリ内のドキュメントを変更し、ファイル全体をゼロから書き出すことです。XMLを最初から書き込むことなくファイルに追加できますか?
XDocument doc = XDocument.Load("pathToDoc.xml");
doc.Root.Add(new XElement(namespace + "anotherChild", new XAttribute("child-id", childId)));
doc.Save("pathToDoc.xml");
あるいは、FileStream
有する:例えば
using (FileStream fs = new FileStream("pathToDoc.xml", FileMode.Open, FileAccess.ReadWrite)) {
XDocument doc = XDocument.Load(fs);
doc.Root.Add(new XElement(namespace + "anotherChild", new XAttribute("child-id", childId)));
fs.SetLength(0);
using (var writer = new StreamWriter(fs, new UTF8Encoding(false))) {
doc.Save(writer);
}
}
しかしながら、両方の場合において、既存のXML文書は、メモリにロードされているメモリで変更し、その後ゼロから書き込ま XMLファイルに追加します。小さなXMLファイルの場合、これは問題ありませんが、数百または数千のノードを持つ大きなファイルの場合、これは非常に非効率的なプロセスのようです。 XDocument
(またはおそらくXmlWriter
のようなもの)を既存のXML文書に追加するだけでなく、ゼロから始めるのではなく、追加のノードを追加する方法はありますか?
よく形成されたXMLが唯一の1つのルートタグを持っています。したがって、既存のファイルを読み、既存のファイルの途中にタグを追加する必要があります。 – jdweng
はい、しかし、良いシリアライザが正しい場所を探して追加するインテリジェンスを持っていることを望みます。 – Jez
XMLファイルは単なるテキストファイルなので、テキストファイルの途中に簡単に挿入する方法はありません。 [.NETでファイルの途中に行を追加する](https://stackoverflow.com/q/2044365/3744182)を参照してください。しかし、ルート要素の終了タグの直前に挿入するので、[XMLの終わりに新しいノードを追加する最速の方法](https://stackoverflow.com/q/849043/3744182)を参照してください。重複 – dbc