我有一个流对象,我想根据输入流中的数据使用某种 xml 流创建和输出 xml。我没有对流做太多的工作,所以我正在努力学习如何尽可能有效地做到这一点。这个想法是我不想将整个输入流加载到内存中,然后在内存中创建整个输出流,因为在某些时候你最终会占用至少两倍的输入流大小。
必须有一些方法,以便在输入流中读取数据时,构建 xml 流并丢弃从输入流中读取的数据。此外,我想对其进行架构,以便 xml 流没有完全构建然后传递出去,而是可以在构建时读取 xml 流。有没有人有一些代码示例或学习这方面的好资源?
如果您需要将 XML 作为原始数据访问,而不需要内存中文档对象模型 (DOM) 的开销,则使用 XmlTextReader
XmlTextReader 为读取 XML 提供了一种更快的机制。以下代码从流中加载 XmlTextReader。
using (XmlTextReader reader= new XmlTextReader (stream)) {
while (reader.Read())
{
switch (reader.NodeType)
{
case XmlNodeType.Element: // The node is an Element.
Console.Write("<" + reader.Name);
Console.WriteLine(">");
break;
case XmlNodeType.Text: //Display the text in each element.
Console.WriteLine (reader.Value);
break;
case XmlNodeType. EndElement: //Display end of element.
Console.Write("</" + reader.Name);
Console.WriteLine(">");
break;
}
}
}
要将 XML 作为流写出,请使用XmlTextWriter。
您可以给它一个要写入的流。这将为您提供您想要的(流输出)并为您提供很大的灵活性。通过将要使用的流作为参数传递给代码,您可以连接内存流、文件流或几乎任何东西,而无需了解 XML 格式化代码。XmlTextWriter 将定期刷新数据(因此除非没有任何内容从流中读取数据,否则它不会一直存在),只需记住在最后进行最终刷新/关闭。
流也是您处理输入的方式。当您处理该输入并可以决定要写入哪些 XML 元素时,使用 XmlTextWriter 来编写它们,它将负责将该数据流式传输给将要读取它的任何人。因此,您最终会得到一个循环(或多个循环),该循环正在读取一点,进行一些处理,然后一次全部写入 XmlTextWriter。
您可以使用 XmlReader.Create 方法创建一个 XmlReaderObject 实例。使用 XmlReaderSettings 指定 XML 设置(XSD、IgnoreComments 等)
XmlReaderSettings settings = new XmlReaderSettings(){
settings.IgnoreComments = true;
using (XmlReader reader = XmlReader.Create("Test.xml",settings)){
while(reader.Read()){
// Construct/Evaluate XML Here....
}
reader.Close();
}
}
如果您使用的是 .net 3.5,则可以使用 XLINQ。这是来自http://blogs.msdn.com/wriju/archive/2007/02/20/xlinq-create-xml-from-object-using-linq.aspx的示例
如果您在“xlinq create”上进行谷歌搜索, 您会发现很多示例(我在想,您可能对 RSS 示例最感兴趣。
var objCust = new[]
{
new {CustID = 2, CustName = "Sumitra", Phone = "123-123-1236"},
new {CustID = 3, CustName = "Wriju", Phone = "123-123-1235"},
new {CustID = 4, CustName = "Writam", Phone = "123-123-1234"},
new {CustID = 1, CustName = "Debajyoti", Phone = "123-123-1237"}
};
XElement _customers = new XElement("customers",
from c in objCust
orderby c.CustID //descending
select new XElement("customer",
new XElement("name", c.CustName),
new XAttribute("ID", c.CustID),
new XElement("phone", c.Phone)
)
);
Console.WriteLine(_customers);
输出将如下所示:
<customers>
<customer ID="1">
<name>Debajyoti</name>
<phone>123-123-1237</phone>
</customer>
<customer ID="2">
<name>Sumitra</name>
<phone>123-123-1236</phone>
</customer>
<customer ID="3">
<name>Wriju</name>
<phone>123-123-1235</phone>
</customer>
<customer ID="4">
<name>Writam</name>
<phone>123-123-1234</phone>
</customer>
</customers>