0

これが私がやろうとしていることです。解決策は簡単だと思いますが、まだ見つけていません(そして、私が試してきたと信じています)。

  • XML データの作成に使用したいオブジェクトがあります。(要素を作成するために XmlTextWriter を使用しています。)
  • 次に、XML データを別のメソッドに渡したいと思います。
  • このメソッドは XML データを取得し、それを XSLT 変換の入力として使用して HTML を取得する必要があります。

Transform メソッドは XMLReader で動作するため、基本的にはまず XmlTextWriter で何かを記述し、これを XmlReader に渡します。

もちろん、ファイルに書き込んでから再度ファイルを読み取ることもできますが、実際にファイルに書き込むのではなく、メモリ内のデータを処理する方が簡単だと思いました。

私が HtmlTextWriter を直接使用していない理由は単純です。私が理解している限り、これは .NET 4.5 でしか機能せず、さまざまな理由でプロジェクトを 4.0 にとどめる必要があります。

後で別のソースから XML を渡すオプションもあります。また、XSLT テンプレートを変更するだけで済み、実際のコードを変更する必要がないため、後で HTML フォームのレイアウトを簡単に変更できるようになります。

4

3 に答える 3

1

あなたは出来る:

StringBuilder sb = new StringBuilder();
var writer = new XmlWriter(sb);

WriteStuff( writer );

writer.Flush();

string s = sb.ToString();

XmlReader reader = new XmlReader(s);

DoStuff(reader);

何をしたいのかわからない、またはそれが最善の方法かどうかはわかりません...でも、できます。


これは、MemoryStream でも同様の方法で機能します。これはおそらく、大量のデータにより適しているでしょう... Flush を忘れないでください...

于 2013-04-15T10:06:00.460 に答える
0

xml 解析を節約するには、XmlWriter を使用してすべてのデータを XmlDocument に書き込み、そこから XmlReader を作成することをお勧めします。

//create xml data
XmlDocument doc = new XmlDocument(); 
using (XmlWriter writer = doc.CreateNavigator().AppendChild()) 
{
   CreateXmlData(writer);  
}

//pass xml data to transform as reader
using (XmlReader reader = new XmlNodeReader(doc))
{
  Transform(reader);
}
于 2013-04-16T22:21:02.163 に答える
0

順序付けられた量のバイトを別の「もの」に送信したいときはいつでも、送信されたのと同じ順序でバイトを解釈する必要がある場合は、System.IO.Stream クラスを使用するのが賢明です。

このクラスを使用して、順序が同じである限り、バイトがどこに行くかはあまり気にしないことを宣言します。したがって、バイトのライターとリーダーの両方は、バイトのストリームがファイル、メモリの一部、さらには紙テープリーダーに入れられても、順序が変更されず、バイトが処理されていない限り気にしません。追加または紛失。

実際には、それらをファイルに書き込むことができると思われるときはいつでも、その後ファイル名を他の人に渡す場合は、ストリームを使用することもできます。あなた、またはファイルへの書き込みを指示したオブジェクトが、ストリームの宛先 (メモリ / 紙テープ / ファイル) を指定してストリームを作成します。ストリームは、ストリームを読み取ることができる他のユーザーに渡されます。

例: MySpecialObject には MySpecialData というデータがあります。この特別なデータをシリアライズおよびデシリアライズするクラスがあります。これらのクラスは、データが物理的にシリアライズされる場所には関心がありません:patertape? ディスケット?メモリー。バイト ストリームを読み書きすることでシリアル化 (逆) できることだけを知っていればよいのです。その場合、System.IO.Stream のインスタンスを使用します。

(クラスを見つけやすくするために、名前空間を記述します)

class MySerializer
{
    private System.IO.Stream myStream = null;

    public MySerializer(system.IO.Stream stream)
    {
        this.myStream = stream;
    }

    public void Serialize(object data)
    {
        System.Xml.Serialization.XmlSerializer serializer =
            new System.Xml.SerializationXmlSerializer(data.GetType());

    System.XML.XmlWriter writer = System.XML XmlWriter.Create(this.MyStream);

    serializer.Serialize(writer, data);
    }
}

よく見ると、ファイルを使用する場合との唯一の違いは XMLWriter.Create() のパラメーターであることがわかります。

これを mySpecialObject で使用すると、次のようになります。

public void SerializeMySpecialData()
{
    System.IO.Stream myStream = new System.IO.MemoryStream();
    // in this case: read and write using only memory.
    // if you want to write to something else, for instance a file,
    // create a file stream.
    // or any other subclass from Sytem.IO.Stream. The serializer won't notice
    // where it is actually stored.
    MySerializer mySerializer = new MySerializer(myStream);
    mySerializer.Serialize(mySpecialData);
    myStream.Flush();
    myStream.Close();
    myStream.Dispose(); // this function will probably also flush and close
}

ストリームからの XML の読み取りは、ファイルからの XML の読み取りに似ています。

public object Deserialize(System.Type expectedDataType)
{
    object data = null;
    System.Xml.Serialization.XmlSerializer deserializer =
        new System.Xml.SerializationXmlSerializer(expectedDataType);

    System.XML.XmlReader reader = System.XML XmlReader.Create(this.MyStream);

    deserializer.Deserialize(reader, data);
    return data;
}

繰り返しますが、利点は、呼び出し元がデータを実際に保存する場所を決定できることです。データが異なるタイプのメディアに保存されている場合、シリアル化クラスは違いを認識しないため、変更する必要はありません。

データが保存されているシリアル化クラスのユーザーに対して非表示にすることもできます。その場合、シリアル化クラスのコンストラクターがストリームを作成します。このアプローチは、すべてのデータをすべて同じメディアでシリアル化する場合に役立ちます。

于 2013-04-15T10:39:35.377 に答える