1

我有一个流对象,我想根据输入流中的数据使用某种 xml 流创建和输出 xml。我没有对流做太多的工作,所以我正在努力学习如何尽可能有效地做到这一点。这个想法是我不想将整个输入流加载到内存中,然后在内存中创建整个输出流,因为在某些时候你最终会占用至少两倍的输入流大小。

必须有一些方法,以便在输入流中读取数据时,构建 xml 流并丢弃从输入流中读取的数据。此外,我想对其进行架构,以便 xml 流没有完全构建然后传递出去,而是可以在构建时读取 xml 流。有没有人有一些代码示例或学习这方面的好资源?

4

4 回答 4

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


}
于 2009-02-10T04:25:13.517 回答
1

要将 XML 作为流写出,请使用XmlTextWriter

您可以给它一个要写入的流。这将为您提供您想要的(流输出)并为您提供很大的灵活性。通过将要使用的流作为参数传递给代码,您可以连接内存流、文件流或几乎任何东西,而无需了解 XML 格式化代码。XmlTextWriter 将定期刷新数据(因此除非没有任何内容从流中读取数据,否则它不会一直存在),只需记住在最后进行最终刷新/关闭。

流也是您处理输入的方式。当您处理该输入并可以决定要写入哪些 XML 元素时,使用 XmlTextWriter 来编写它们,它将负责将该数据流式传输给将要读取它的任何人。因此,您最终会得到一个循环(或多个循环),该循环正在读取一点,进行一些处理,然后一次全部写入 XmlTextWriter。

于 2009-02-10T06:02:03.300 回答
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();
        }
    }
于 2009-02-10T04:35:43.740 回答
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>
于 2009-02-10T06:31:29.517 回答