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
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);
}