0

这就是我想要做的。我确信解决方案很简单,我只是还没有找到它(相信我我一直在尝试)。

  • 我有一个我想用来创建 XML 数据的对象。(我使用 XmlTextWriter 来创建元素。)
  • 然后我想将 XML 数据传递给另一个方法。
  • 此方法应获取 XML 数据并将其用作 XSLT 转换以获取 HTML 的输入。

Transform 方法适用于 XMLReader,所以基本上我想先用 XmlTextWriter 编写一些东西,然后将其传递给 XmlReader。

当然,我可以只写入文件然后再次读取文件,但我认为只处理内存中的数据而不实际将其写入文件会更容易。

我不直接使用 HtmlTextWriter 的原因很简单:据我了解,这仅适用于 .NET 4.5,并且由于各种原因,该项目需要保留在 4.0 中。

稍后还可以选择从另一个来源传递 XML,这就是我想坚持使用 XSLT 转换的原因。此外,这将使以后更容易更改 HTML 表单的布局,因为我只需要更改 XSLT 模板而不更改实际代码。

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 以类似的方式工作,这可能更适合大量数据......只是不要忘记刷新......

于 2013-04-15T10:06:00.460 回答
0

每当您想将有序数量的字节发送到另一个“thingy”时,它需要以与发送字节相同的顺序来解释字节,使用 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 中使用 this:

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 回答
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 回答