.NET で XmlWriter を使用して XmlDocument を作成するにはどうすればよいですか?
-
20-09-2019 - |
質問
多くの .NET 関数は、XmlWriter を使用して XML を出力/生成します。ファイル/文字列/メモリへの出力は非常に複雑な操作です。
XmlWriter xw = XmlWriter.Create(PutYourStreamFileWriterEtcHere);
xw.WriteStartElement("root");
...
場合によっては、結果の Xml を操作する必要があり、それを XmlDocument にロードしたい場合や、他の理由で XmlDocument が必要になる場合がありますが、XmlWriter を使用して XML を生成する必要があります。たとえば、XmlWriter のみに出力するサード パーティ ライブラリの関数を呼び出す場合です。
実行できることの 1 つは、xml を文字列に書き込み、それを XmlDocument にロードすることです。
StringWriter S = new StringWriter();
XmlWriter xw = XmlWriter.Create(S);
/* write away */
XmlDocument xdoc = new XmlDocument();
xdoc.LoadXml(S.ToString());
ただし、これは非効率的です。最初にすべての XML 情報を文字列にシリアル化し、次にその文字列を再度解析して DOM を作成します。
XmlWriter を指定して XmlDocument を直接構築するにはどうすればよいでしょうか?
解決
少なくとも 1 つの解決策は次のとおりです。
XmlDocument doc = new XmlDocument();
using (XmlWriter writer = doc.CreateNavigator().AppendChild())
{
// Do this directly
writer.WriteStartDocument();
writer.WriteStartElement("root");
writer.WriteElementString("foo", "bar");
writer.WriteEndElement();
writer.WriteEndDocument();
// or anything else you want to with writer, like calling functions etc.
}
どうやら XpathNavigator は AppendChild() を呼び出すと XmlWriter を提供します。
Martin Honnen の功績は次のとおりです。 http://groups.google.com/group/microsoft.public.dotnet.xml/browse_thread/thread/24e4c8d249ad8299?pli=1
他のヒント
あなたは反対のことを行うことができます:最初のDOMを使用してXmlDocument
を構築し、その後、XmlWriter
に書き込みます:
XmlDocument xdoc = new XmlDocument();
... // build the document
StringWriter S = new StringWriter();
XmlWriter xw = XmlWriter.Create(S);
xdoc.WriteTo(xw);
あなたはのXmlWriterクラスを使用してXMLファイルを書き込むことができます。 ここでは、このための例です。
XmlWriterSettings objSetting = new XmlWriterSettings();
objSetting.Indent = true;
objSetting.NewLineOnAttributes = true;
System.Text.StringBuilder sb = new System.Text.StringBuilder();
using (XmlWriter objWriter = XmlWriter.Create(sb, objSetting))
{
//Note the artificial, but useful, indenting
objWriter.WriteStartDocument();
objWriter.WriteStartElement("books");
////////Start Book Element///////
objWriter.WriteStartElement("book");
objWriter.WriteStartAttribute("ISBN");
objWriter.WriteValue("asp1");
objWriter.WriteEndAttribute();
objWriter.WriteStartElement("Title");
objWriter.WriteValue("ASP.NET");
objWriter.WriteEndElement();
objWriter.WriteElementString("ReleaseDate", "11/11/2010");
objWriter.WriteStartElement("Pages");
objWriter.WriteValue(200);
objWriter.WriteEndElement(); //price
objWriter.WriteEndElement(); //book
////////End Book Element///////
////////Another Element
////////Start Book Element///////
objWriter.WriteStartElement("book");
objWriter.WriteStartAttribute("ISBN");
objWriter.WriteValue("c#2");
objWriter.WriteEndAttribute();
objWriter.WriteStartElement("Title");
objWriter.WriteValue("C#.NET");
objWriter.WriteEndElement();
objWriter.WriteElementString("ReleaseDate", "10/11/2010");
objWriter.WriteStartElement("Pages");
objWriter.WriteValue(500);
objWriter.WriteEndElement();
objWriter.WriteEndElement(); //book
////////End Book Element///////
objWriter.WriteEndElement(); //books
objWriter.WriteEndDocument();
}
File.WriteAllText(Server.MapPath("BooksList.xml"), sb.ToString());
XmlWriter の背後にある考え方は、データの変更が完了するまで待ってから書き込みを開始することです。
XmlWriter は、ユーザーの状況を念頭に置いて構築されたものではありません。
どちらか
- 書く前にあなたのデータがどうなるかを知るまで待ってください
または
- 今やっていることをやってみよう
のXmlWriterをに書いていたことを基になるストリームオブジェクトがあり、それは(のMemoryStream)双方向だった場合、あなたは単にバックにその位置を再-O - 、その後XmlDocument.Load(ストリーム)にStreamオブジェクトを使用することができますます。
HTH、
Z