51

多くの .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 を直接構築するにはどうすればよいですか?

4

5 に答える 5

91

少なくとも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を提供します

クレジットはMartinHonnenに送られます:http://groups.google.com/group/microsoft.public.dotnet.xml/browse_thread/thread/24e4c8d249ad8299?pli = 1

于 2009-08-28T14:28:31.957 に答える
11

逆のこともできます。XmlDocument最初にDOMを使用してビルドし、次にそれをXmlWriter:に書き込みます。

XmlDocument xdoc = new XmlDocument();
... // build the document

StringWriter S = new StringWriter();
XmlWriter xw = XmlWriter.Create(S);
xdoc.WriteTo(xw);
于 2009-08-28T13:41:52.640 に答える
8

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());
于 2012-07-23T09:10:33.337 に答える
4

XmlWriter の背後にある考え方は、書き込みを開始する前に、データの変更が完了するまで待機することです。

XmlWriter は、あなたの状況を念頭に置いて構築されていません。

また

  • 書き込む前に、データがどうなるかがわかるまで待ちます

また

  • 現在していることを実行する
于 2009-08-28T13:45:50.327 に答える
1

XmlWriter が書き込んでいた基になる Stream オブジェクトがあります。双方向 (MemoryStream) の場合は、単純に位置を -0- に戻し、XmlDocument.Load(stream) で Stream オブジェクトを使用できます。

HTH、

Z

于 2009-08-28T13:46:42.230 に答える