新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> DTD, XML Schema(XMLS), RELAX NG
    [返回] 中文XML论坛 - 专业的XML技术讨论区XML.ORG.CN讨论区 - XML技术『 DTD/XML Schema 』 → [推荐]技巧: 使用 StAX 编写 XML 文档 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 3232 个阅读者  浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: [推荐]技巧: 使用 StAX 编写 XML 文档 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     anchen0617 帅哥哟,离线,有人找我吗?双子座1983-6-17
      
      
      威望:5
      等级:大二(研究C++)
      文章:281
      积分:3413
      门派:XML.ORG.CN
      注册:2004/10/17

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给anchen0617发送一个短消息 把anchen0617加入好友 查看anchen0617的个人资料 搜索anchen0617在『 DTD/XML Schema 』的所有贴子 访问anchen0617的主页 引用回复这个贴子 回复这个贴子 查看anchen0617的博客楼主
    发贴心情 [推荐]技巧: 使用 StAX 编写 XML 文档

    Streaming API for XML (StAX) 不仅能解析 XML 文档,而且可以把 XML 文档写入一个输出流。这篇技巧展示了客户应用程序如何使用底层的、基于指针的 StAX API 有效地创建 XML 文档。
    直到最近,程序员通过编程创建 XML 文档还只有两种选择。一种是把序列化的 XML 内容写入输出流,第二种是使用 DOM。

    这两种方法都有严重的缺陷。对于第一种情况,程序员完全负责保证结果文档是格式正规的。程序员必须处理其中的细节,比如起始标签和结束标签的匹配,以及字符内容中特殊字符的转义,如小于号(<)和逻辑与(&)。这可能造成程序的实现冗长乏味而且容易出错。另一方面,尽管 DOM 把程序员从这种沉重的负担中解放出来,但是引入了巨大的开销:在序列化到输出流之前,整个文档必须首先在内存中构造一棵节点树。

    进入 StAX
    Streaming API for XML (StAX) 彻底改变这一切。与 Simple API for XML (SAX) 不同,StAX 提供了编写 XML 文档的 API。更具体地说,它提供了两种 API:底层的、基于指针的 API(XMLStreamWriter)和高级的、基于事件的 API(XMLEventWriter)。基于指针的 API 最适合用于数据绑定的情况(比如从应用程序数据创建文档),而基于事件的 API 则通常用于管道式的情况,从输入文档中的数据构造新的文档。

    下面的例子是使用基于指针的 API 实现的。(我将在下篇技巧中讨论基于事件的 API。)基于指针的 API 为创建 XML 信息集中的不同元素提供了各种专门的方法,比如元素、属性、处理指令、数据类型声明和字符内容。这些方法解决了许多格式化问题。比如,writeCharacters() 方法自动转义像小于号(<)、大于号(>)和逻辑与(&)这样的特殊字符。而 writeEndDocument() 则自动关闭所有打开的结构。因此即使把本例中最后一次对 writeEndElement() 的调用注释掉也没有关系。

    StAX 甚至可以为没有正式声明的名称空间生成名称空间前缀。但是只有在输出工厂的 javax.xml.stream.isPrefixDefaulting 属性设为 true 时才会这么做。如果该属性被设为 false,您就必须明确地声明每个名称空间前缀,并对每个名称空间使用 setPrefix() 和 writeNamespace() 方法。清单 1 中,我已经把这些方法调用注释掉了,因为我已经把前缀默认设置为 true。

    清单 1. 编写文档

    import javax.xml.stream.*;

    public class XMLWriter {

       // Namespaces
       private static final String GARDENING = "http://com.bdaum.gardening";
       private static final String XHTML = "http://www.w3.org/1999/xhtml";

       public static void main(String[] args) throws XMLStreamException  {
          

          // Create an output factory
          XMLOutputFactory xmlof = XMLOutputFactory.newInstance();
          // Set namespace prefix defaulting for all created writers
          xmlof.setProperty("javax.xml.stream.isPrefixDefaulting",Boolean.TRUE);
          
          // Create an XML stream writer
          XMLStreamWriter xmlw =
             xmlof.createXMLStreamWriter(System.out);

          // Write XML prologue
          xmlw.writeStartDocument();
          // Write a processing instruction
          xmlw.writeProcessingInstruction(
             "xml-stylesheet href='catalog.xsl' type='text/xsl'");
          // Now start with root element
          xmlw.writeStartElement("product");
          // Set the namespace definitions to the root element
          // Declare the default namespace in the root element
          xmlw.writeDefaultNamespace(GARDENING);
          // Writing a few attributes
          xmlw.writeAttribute("productNumber","3923-1");
          xmlw.writeAttribute("name","Nightshadow");
          // Declare XHTML prefix
    //    xmlw.setPrefix("xhtml",XHTML);
          // Different namespace for description element
          xmlw.writeStartElement(XHTML,"description");
          // Declare XHTML namespace in the scope of the description element
    //    xmlw.writeNamespace("xhtml",XHTML);
          xmlw.writeCharacters(
             "A tulip of almost black color. \nBlossoms in April & May");
          xmlw.writeEndElement();
          // Shorthand for empty elements
          xmlw.writeEmptyElement("supplier");
          xmlw.writeAttribute("name","Floral22");
    //    xmlw.writeEndElement();
          // Write document end. This closes all open structures
          xmlw.writeEndDocument();
          // Close the writer to flush the output
          xmlw.close();
       }

    }

    注意,StAX 不能保证文档的格式正规性。仍然可能生成违反 XML 推荐标准的文档,比如一个文档中有多个根元素或者多个 XML 序言,标签名和属性名中包含空格或 XML 不支持的字符。StAX 实现可以检查这些问题,但并不要求这么做(参考实现中就没有这样做)。尽管如此,StAX XMLStreamWriter 对于输出原始 XML 数据仍然是一个很大的改进,而且开销只是 DOM 的一个零头。

    结束语
    这篇技巧说明了如何使用 StAX 基于指针的 API 有效地编写 XML 文档。在下一篇文章中,我将介绍如何使用基于事件的 API 合并两个 XML 文档。


       收藏   分享  
    顶(0)
      





    关闭广告显示

    ----------------------------------------------
    xml这门语言太好了,我们共同努力吧!!!!!

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2004/11/9 15:20:00
     
     GoogleAdSense双子座1983-6-17
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 DTD/XML Schema 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2025/6/21 2:00:15

    本主题贴数1,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    155.762ms