我有一个流对象,我想根据输入流中的数据使用某种xml流创建和输出xml。我没有做过很多关于流的工作,所以我试图尽可能高效地学习如何做到这一点。我的想法是我不想在内存中加载整个输入流,然后在内存中创建整个输出流,因为在某些时候你最终会占用占用内存的输入流的两倍。
必须有一些方法,以便在输入流中读取数据时,构建xml流并丢弃从输入流中读取的数据。另外,我想构建它以便xml流不是完全构建然后传递出去,而是可以在构建时读取xml流。有没有人有一些代码样本,或者有很好的资源来学习这个?
答案 0 :(得分:2)
如果您需要以原始数据的形式访问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;
}
}
}
答案 1 :(得分:1)
要将XML作为流编写,请使用XmlTextWriter。
你可以给它写一个流来写。这将为您提供您想要的(流输出)并为您提供很大的灵活性。通过将流作为参数传递给您的代码,您可以连接内存流,或文件流或几乎任何东西,而无需XML格式代码需要知道。 XmlTextWriter会定期刷新数据(所以除非没有从流中读取数据,否则它不会粘在一起),只记得在最后进行最后的刷新/关闭。
Streams也是你处理输入的方式。当您处理该输入并且可以决定要写入哪些XML元素时,使用XmlTextWriter来编写它们,它将负责将数据流式传输给任何将要读取它的人。所以你最终得到一个循环(或循环),读取一点,做一些处理,然后一次写入XmlTextWriter。
答案 2 :(得分:0)
您可以使用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();
}
}
答案 3 :(得分:0)
如果您使用的是.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>