Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在内存中创建XML并通过XSLT传递给另一个方法进行转换_C#_.net_Xml_Xslt_Xmltextwriter - Fatal编程技术网

C# 在内存中创建XML并通过XSLT传递给另一个方法进行转换

C# 在内存中创建XML并通过XSLT传递给另一个方法进行转换,c#,.net,xml,xslt,xmltextwriter,C#,.net,Xml,Xslt,Xmltextwriter,这就是我想做的。我确信解决方案很简单,我只是还没有找到它(相信我,我一直在尝试) 我有一个对象,我想用它来创建XML数据。(我正在使用XmlTextWriter创建元素。) 然后我想将XML数据传递给另一个方法 此方法应获取XML数据,并将其用作XSLT转换的输入,以获取HTML 转换方法与XMLReader一起工作,所以基本上我想首先使用XmlTextWriter编写一些东西,然后将其传递给XMLReader 当然,我可以只写一个文件,然后再次读取该文件,但我认为只处理内存中的数据而不实际

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

  • 我有一个对象,我想用它来创建XML数据。(我正在使用XmlTextWriter创建元素。)
  • 然后我想将XML数据传递给另一个方法
  • 此方法应获取XML数据,并将其用作XSLT转换的输入,以获取HTML
转换方法与XMLReader一起工作,所以基本上我想首先使用XmlTextWriter编写一些东西,然后将其传递给XMLReader

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

我不直接使用HtmlTextWriter的原因很简单:据我所知,这只适用于.NET4.5,并且由于各种原因,项目需要保留在4.0中

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

您可以:

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也将以类似的方式工作,它可能更适合于大量数据。。。只要别忘了刷新…

每当您想向另一个“thingy”发送一个有序的字节数时,它需要按照发送的相同顺序解释字节,明智的做法是使用System.IO.Stream类

使用这个类,您声明只要顺序保持不变,您并不真正关心字节的去向。因此,只要顺序没有改变,没有字节被添加或丢失,字节的写入者和读取器都不关心字节流是否被放入文件、内存甚至纸带读取器中

实际上:只要您认为可以将它们写入文件,然后将文件名提供给其他人,您也可以使用流。您或命令您将其写入文件的对象创建具有流目标(内存/纸带/文件)的流。然后将流传递给另一个可以读取流的用户

例如: MySpecialObject有一些数据:MySpecialData。有一些类可以序列化和反序列化这些特殊数据。这些类对数据被fysically序列化的地方不感兴趣:patertape?软盘?记忆。他们只需要知道他们可以通过写入和读取字节流来(反)序列化它。在这种情况下,使用System.IO.Stream的实例

(我编写名称空间,以便更容易找到类)

如果仔细观察,您会发现使用文件的唯一区别是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;
}
再次强调:优点是调用方决定数据实际存储的位置。如果数据存储在不同类型的媒体上,序列化类将看不到差异,因此不必更改


您还可以决定向存储数据的序列化类的用户隐藏。在这种情况下,序列化类的构造函数创建流。如果希望所有数据都在同一介质上序列化,这种方法将非常有用。

为了节省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);
}

HtmlTextWriter来自.NET1oh,你说得对。奇怪的是,在我将项目属性更改为.NET4.5之前,我尝试的方法都没有成功。我仍然希望使用XSLT转换,因为它将允许我从另一个源传入XML,并重用XSLT模板以确保没有冗余。这里看起来像是输入错误:System.XML.Serialization.XmlSerializer serializer=new System.XML.*Serialization.XmlSerializer**(data.GetType());
//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);
}