• 对XML的收集4


    XML Writer

    表示一个编写器,该编写器提供一种快速、非缓存和只进的方式来生成包含 XML 数据的流或文件。

    命名空间: System.Xml
    程序集: System.Xml(在 System.Xml.dll 中)


    语法

    --------------------------------------------------------------------------------

    public abstract class XmlWriter : IDisposable

    备注

    --------------------------------------------------------------------------------
     
    XmlWriter 类支持 W3C 可扩展标记语言 (XML) 1.0 和"XML 中的命名空间"建议。
     
    说明:
    来创建 XmlWriter 对象。
     

    注意   使用 XmlWriter 方法输出 XML 时,在调用 Close 方法前,不会写入元素和属性。
     
    安全注意事项
     

    当使用 XmlWriter 类时需要考虑下列事项。

    XmlWriter 引发的异常可能会泄漏您不希望冒泡到应用程序的路径信息。应用程序必须捕捉并适当处理这些异常。


    XmlWriter 不验证任何传递到 WriteDocType 或 WriteRaw 方法的数据。您不应将任意数据传递给这些方法。

    示例

    --------------------------------------------------------------------------------
    下面的示例在流中导航以确定当前节点类型,然后使用 XmlWriter 输出 XmlReader 内容。

    StringBuilder output = new StringBuilder();

    String xmlString =
            @"<?xml version='1.0'?>
            <!-- This is a sample XML document -->
            <Items>
              <Item>test with a child element <more/> stuff</Item>
            </Items>";
    // Create an XmlReader
    using (XmlReader reader = XmlReader.Create(new StringReader(xmlString)))
    {
        XmlWriterSettings ws = new XmlWriterSettings();
        ws.Indent = true;
        using (XmlWriter writer = XmlWriter.Create(output, ws))
        {

            // Parse the file and display each of the nodes.
            while (reader.Read())
            {
                switch (reader.NodeType)
                {
                    case XmlNodeType.Element:
                        writer.WriteStartElement(reader.Name);
                        break;
                    case XmlNodeType.Text:
                        writer.WriteString(reader.Value);
                        break;
                    case XmlNodeType.XmlDeclaration:
                    case XmlNodeType.ProcessingInstruction:
                        writer.WriteProcessingInstruction(reader.Name, reader.Value);
                        break;
                    case XmlNodeType.Comment:
                        writer.WriteComment(reader.Value);
                        break;
                    case XmlNodeType.EndElement:
                        writer.WriteFullEndElement();
                        break;
                }
            }

        }
    }
    OutputTextBlock.Text = output.ToString();

    继承层次结构

    --------------------------------------------------------------------------------


     System.Object
      System.Xml.XmlWriter
        System.Xml.XmlDictionaryWriter
    **************************************************************************************

    此代码主要演示了如何使用XmlWriter来填充XML树,同时也顺带示范了如何使用XslCompiledTransform按照指定的样式表将XML从一个格式转换成另外一个新的格式。

    示例代码
    使用XDocument.CreateWriter()方法将会创建一个XmlWriter,随后向这个XmlWriter写入的任何内容都会被写入的XDocument表示的XML树中,这是关键点。另外使用XDocument.CreateReader()则可以创建一个XmlReader,然后使用此读取器就可以读取内存中XML树中的内容了。这两个方法一个创建了写入器,一个创建了读取器。
    代码中是使用XslCompiledTransform类来转换XML文档的,这可以通过它的XslCompiledTransform.Transform()方法完成,而在调用此方法之前,应该确保已经通过调用XslCompiledTransform.Load()方法加载了样式表。不然,要让它如何给你转换呢?^_^

    view source

    print?
    string XslMarkup = @"<?xml version='1.0'?> 

        <xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'> 

            <xsl:template match='/Parent'> 

                <Root> 

                    <C1> 

                        <xsl:value-of select='Child1'/> 

                    </C1> 

                    <C2> 

                        <xsl:value-of select='Child2'/> 

                    </C2> 

                </Root> 

            </xsl:template> 

        </xsl:stylesheet>"; 

      

    XDocument SourceTree = new XDocument( 

        new XElement("Parent", 

            new XElement("Child1", "Child1 data"), 

            new XElement("Child2", "Child2 data"))); 

      

    XDocument NewTree = new XDocument(); 

      

    using (XmlWriter Writer = NewTree.CreateWriter()) 

        XslCompiledTransform xslt = new XslCompiledTransform(); 

        xslt.Load(XmlReader.Create(new StringReader(XslMarkup))); 

        xslt.Transform(SourceTree.CreateReader(), 

            Writer); 

    Console.WriteLine(NewTree);


    代码中所创建的原始的XML树内容是这样的:

    view source

    print?
    <Parent> 

      <Child1>Child1 data</Child1> 

      <Child2>Child2 data</Child2> 

    </Parent>


    转换后的内容则是这样的:

    view source

    print?
    <Root> 

      <C1>Child1 data</C1> 

      <C2>Child2 data</C2> 

    </Root>


    这说明了什么呢?说明已经被转换了嘛!-_-

    **************************************************************************************
    填充 XML 树的一种方式是使用 CreateWriter 创建一个 XmlWriter,然后写入 XmlWriter。XML 树将用写入到 XmlWriter 的所有节点进行填充。

    在与预期会向 XmlWriter 写入数据的另一个类(如 XslCompiledTransform)一起使用 LINQ to XML 时,通常应使用此方法。

    CreateWriter 可能在调用 XSLT 转换时使用。本示例创建一个 XML 树,从该 XML 树创建一个 XmlReader,创建一个新文档,然后创建要写入到新文档的 XmlWriter。示例然后调用 XSLT 转换,传入 XmlReader 和 XmlWriter。在转换成功完成后,将使用转换结果填充新的 XML 树。

    string xslMarkup = @"<?xml version='1.0'?>
    <xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'>
        <xsl:template match='/Parent'>
            <Root>
                <C1>
                <xsl:value-of select='Child1'/>
                </C1>
                <C2>
                <xsl:value-of select='Child2'/>
                </C2>
            </Root>
        </xsl:template>
    </xsl:stylesheet>";

    XDocument xmlTree = new XDocument(
        new XElement("Parent",
            new XElement("Child1", "Child1 data"),
            new XElement("Child2", "Child2 data")
        )
    );

    XDocument newTree = new XDocument();
    using (XmlWriter writer = newTree.CreateWriter())
    {
        // Load the style sheet.
        XslCompiledTransform xslt = new XslCompiledTransform();
        xslt.Load(XmlReader.Create(new StringReader(xslMarkup)));

        // Execute the transformation and output the results to a writer.
        xslt.Transform(xmlTree.CreateReader(), writer);
    }

    Console.WriteLine(newTree);

     
    此示例产生以下输出:


    <Root>
      <C1>Child1 data</C1>
      <C2>Child2 data</C2>
    </Root>
    ******************************************************************************************

    XmlTextWriter类可以把XML写入一个流、文件或TextWriter对象中。与XmlTextReader一样,XmlTextWriter类以只向前、未缓存的方式进行写入。XmlTextWriter的可配置性很高,可以指定是否缩进文本、缩进量、在属性值中使用什么引号以及是否支持命名空间等信息。

        下面是一个简单的示例,说明了如何使用XmlTextWriter类,这段代码在XMLWriterSample1文件夹中:
        private void button1_Click(object sender, System.EventArgs e)
        {
           // change to match your path structure
           string fileFTEL="..\\..\\..\\booknew.xml";
           // create the XmlTextWriter
           XmlTextWriter tw=new XmlTextWriter(fileName,null);
           // set the formatting to indented
           tw.Formatting=Formatting.Indented;
           tw.WriteStartDocument();
           // Start creating elements and attributes
           tw.WriteStartElement("book");
           tw.WriteAttributeString("genre","Mystery");
           tw.WriteAttributeString("publicationdate","2001");
           tw.WriteAttributeString("ISBN","123456789");
           tw.WriteElementString("title","The Case of the Missing Cookie");
           tw.WriteStartElement("author");
           tw.WriteElementString("name","Cookie Monster");
           tw.WriteEndElement();
           tw.WriteElementString("price","9.99");
           tw.WriteEndElement();
           tw.WriteEndDocument();
           //clean up
           tw.Flush();
           tw.Close();
        }

        这里编写一个新的XML文件booknew.xml,并给一本新书添加数据。注意XmlTextWriter会用新文件重写旧文件。本章的后面会把一个新元素或节点插入到现有的文档中,使用FileStream对象作为参数,实例化XmlTextWriter对象。还可以把一个带有文件名和路径的字符串或者一个基于TextWriter的对象作为参数。接着,设置Indenting属性,之后,子节点就会自动从父节点缩进。WriteStartDocument()会添加文档声明。下面开始写入数据。首先是book元素,添加genre、publicationdate 和 ISBN属性。然后写入title、author和price元素,注意author元素有一个子元素名。

        单击按钮,生成booknew.xml文件:
        <?xml version="1.0"?>
        <book genre="Mystery" publicationdate="2001" ISBN="123456789">
          <title>The Case of the Missing Cookie</title>
          <author>
            <name>Cookie Monster</name>
          </author>
          <price>9.99</price>
        </book>

        在开始和结束写入元素和属性时,要注意控制元素的嵌套。在给authors元素添加name子元素时,就可以看到这种嵌套。注意WriteStartElement()和 WriteEndElement()方法调用是如何安排的,以及它们是如何在输出文件中生成嵌套的元素的。

        除了WriteElementString ()和 WriteAttributeString()方法外,还有其他几个专用的写入方法。WriteCData()可以输出一个Cdata部分(<!CDATA[…])>),把要写入的文本作为一个参数。WriteComment()以正确的XML格式写入注释。WriteChars()写入字符缓冲区的内容,其工作方式类似于前面的ReadChars(),它们都使用相同类型的参数。WriteChar()需要一个缓冲区(一个字符数组)、写入的起始位置(一个整数)和要写入的字符个数(一个整数)。

        使用基于XmlReader 和 XmlWriter的类读写XML是非常灵活的,使用起来也很简单。下面介绍如何使用System.Xml命名空间中XmlDocument 和 XmlNode类执行DOM。

  • 相关阅读:
    mr程序无法输出日志进行调试的解决方法
    2015年度总结
    Hadoop数据目录迁移
    Oracle数据迁移至HBase操作记录
    Hadoop端口一览表
    Hadoop Maven pom文件示例
    十个书写Node.js REST API的最佳实践(下)
    iOS 程序从开发完到上 AppStore 那点事儿
    拿什么拯救你,我的三十五岁
    Spark 以及 spark streaming 核心原理及实践
  • 原文地址:https://www.cnblogs.com/SanMaoSpace/p/2172756.html
Copyright © 2020-2023  润新知