`
giraffeql
  • 浏览: 17802 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

SAX生成XML时空指针

    博客分类:
  • Java
阅读更多
在同时SAX方式生成XML时处理空指针问题



代码:
// ......
handler.setResult(resultxml);
handler.startDocument();

// xml元素
AttributesImpl attr = new AttributesImpl();
attr.addAttribute("", "", "xmlns:xsi", "", "http://www.w3.org/2001/XMLSchema-instance");
attr.addAttribute("", "", "xsi:noNamespaceSchemaLocation", "", "关联关系XML Schema-3.0.xsd");
attr.addAttribute("", "", "License", "", "Gicom");
handler.startElement("", "", "Document", attr);

attr = new AttributesImpl();
attr.addAttribute("", "", "version", "", null); // (1处) 元素Events的属性为null,导致的NullPointerException
handler.startElement("", "", "Events", attr); // (1’处) 

attr = new AttributesImpl();
attr.addAttribute("", "", "name", "", "RelationCreate");
handler.startElement("", "", "Event", attr); // (2处)  java.lang.NullPointerException

空指针指向
handler.startElement("", "", "Event", attr);
而当前行,handler和attr均非空


错误信息:
java.lang.NullPointerException
	at org.apache.xml.serializer.ToStream.writeAttrString(ToStream.java:1915)
	at org.apache.xml.serializer.ToStream.processAttributes(ToStream.java:1895)
	at org.apache.xml.serializer.ToStream.closeStartTag(ToStream.java:2360)
	at org.apache.xml.serializer.ToStream.startElement(ToStream.java:1732)
	at org.apache.xalan.transformer.TransformerIdentityImpl.startElement(TransformerIdentityImpl.java:1020)
	at com.geap.gpwms.preStorage.service.impl.PreStorageServiceImpl.startElement(PreStorageServiceImpl.java:2784)
	at com.geap.gpwms.preStorage.service.impl.PreStorageServiceImpl.createRelationFile4storage(PreStorageServiceImpl.java:2626)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)


其实原因在于handler处理的上一个元素(1’处)不会立即解析当前属性,当调用handler做下一步操作时,才解析。导致的空指针指向与实际情况不一致。

另外,关于上面一点说明我们从单个闭合标签的出现也可以说明。
handler.startElement("", "", "Code", code); // (3)
handler.endElement("", "", "Code"); //(4)

得到的文件是:
<Code curCode="81004670013244603097"/>
而不是:
<Code curCode="81004670013244603097"></Code>
说明handler是在解析到(4)是才写入文件,并且发现Code开启后马上关闭,所以是一个闭合标签。


  • 大小: 25.5 KB
分享到:
评论

相关推荐

    sax生成并解析大文件的xml

    在Java中,使用SAX生成XML文件并不常见,因为SAX通常用于解析,而不是创建。然而,通过自定义`ContentHandler`,我们可以控制XML元素的生成过程。`ContentHandler`是一个接口,包含如`startElement`、`endElement`...

    SAX解析XML文件实例

    SAX解析XML文件的实例。一个项目同时用dom解析和sax解析xml文件貌似会报错,项目框架建一直是用sax和dom4j解析xml文件的。当我用dom解析xml文件。导入包后就报错识别不了xml文件的编码格式。于是做了一个sax解析xml...

    android sax ,dom生成xml文件

    本文将深入探讨两种主要的XML文件生成方法:SAX(Simple API for XML)和DOM(Document Object Model),并结合Android环境进行详细阐述。 首先,我们来看SAX解析器。SAX是一种事件驱动的解析器,它不会一次性加载...

    Sax解析XML文件解析

    SAX(Simple API for XML)是XML解析的一种方法,它以事件驱动的方式处理XML文档,非常适合处理大体积的XML文件,因为它不需要一次性加载整个文件到内存,而是逐行读取,因此节省了资源。 **SAX解析XML的基本原理:...

    Servlet利用SAX解析XML文档

    在处理XML数据时,SAX(Simple API for XML)是一种常见的解析器,它采用事件驱动模型,以流式方式读取XML文档,降低了内存占用,适用于处理大型XML文件。本主题将深入探讨如何在Servlet中利用SAX解析XML文档。 ...

    Java SAX解析Xml文档Demo

    Java SAX(Simple API for XML)解析器是一种基于事件驱动的XML解析方式,它不将整个XML文档加载到内存中,而是逐行读取,当遇到某个事件(如开始标签、结束标签等)时,会触发相应的事件处理器方法。这种方式节省了...

    SAX_XML.rar_XML SAX_sax xml_xml

    SAX(Simple API for XML)是XML解析器的一种,它以事件驱动的方式解析XML文档,而非DOM(Document Object Model)解析器那样将整个XML文档加载到内存中。SAX解析器在处理大型XML文件时更高效,因为它只在需要时读取...

    QT使用SAX读取xml高效-快速.rar

    QT使用SAX读取xml高效-快速.rar SAX(Simple API for XML) 如果你只想读取并显示整个XML文档,那么SAX是很好的选择,因为它提供了比DOM更简单的接口,并且它不需要将整个XML文档一次性读入内存,这样便可以用来读取...

    Sax解析xml文件

    在Android和Java编程中,处理XML文件是常见的任务,而SAX(Simple API for XML)是一种轻量级、事件驱动的XML解析器,它以流式方式读取XML文档,只在需要时解析内容,因此非常适合处理大体积的XML文件。 SAX解析器...

    sax_解析生成xml

    一个实现SAX的解析器(也就是“SAX Parser”)以一个串流解析器的型式作用,拥有事件驱动API。由使用者定义回调函数,解析时,若发生事件的话会被调用。SAX事件包括: XML 文字 节点 XML 元素 节点 XML 虚理指令 ...

    Servlet利用SAX解析XML文档(新上传的有源码)

    Servlet利用SAX解析XML文档(新上传的有源码)Servlet利用SAX解析XML文档(新上传的有源码)Servlet利用SAX解析XML文档(新上传的有源码)Servlet利用SAX解析XML文档(新上传的有源码)Servlet利用SAX解析XML文档(新上传的有...

    sax解析xml本地读取xml

    SAX(Simple API for XML)是XML解析器的一种,它采用事件驱动的方式对XML文档进行解析,而不是一次性加载整个文档到内存中,因此在处理大型XML文件时,SAX解析器具有较高的性能和较低的内存消耗。 标题“sax解析...

    sax解析xml尤其是获取元素的值或者内容

    Java中,可以使用`SAXParserFactory`来生成`SAXParser`,然后调用`parse()`方法解析XML文件。例如: ```java SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser parser = factory....

    dom和sax对xml的解析

    在Java中,有多种方式可以解析XML文档,其中最常用的是DOM(Document Object Model)和SAX(Simple API for XML)。本篇文章将详细介绍DOM和SAX解析XML的方法,并通过提供的`DomDemo.java`和`SaxDemo.java`示例代码...

    sax解析xml文件

    SAX(Simple API for XML)是一种轻量级的XML解析技术,主要用于读取XML文档。相较于DOM(Document Object Model)解析器,SAX解析器占用更少的内存和处理时间,因为它不会一次性加载整个XML文档到内存,而是采用...

    XML-java.rar_XML SAX_sax_sax xml_sax 解析 xml_xml using dom

    Java作为一种强大的编程语言,提供了多种解析XML文档的方法,其中包括DOM(Document Object Model)和SAX(Simple API for XML)。本压缩包文件“XML-java.rar”包含了关于使用Java解析XML的实例,特别强调了SAX解析...

    android 使用Sax解析XML 源码实例

    使用SAX方式解析XML SAX 是读取和操作 XML 数据的更快速、更轻量的方 法。SAX 允许您在读取文档时处理它,从而不必等待整个文档被存储之后才采取操作。它不涉及 DOM 所必需的开销和概念跳跃。 SAX API是一个基于事件...

    SAX解析XML实例

    本篇我们将深入探讨SAX(Simple API for XML)解析XML的实例。 SAX,全称为Simple API for XML,是一种基于事件驱动的解析方式。与DOM(Document Object Model)解析器不同,SAX并不将整个XML文档加载到内存中形成...

    通过SAX和PULL来解析XML,同时生成xml

    XML(eXtensible Markup Language)是一种用于存储和...通过阅读指定的博客文章(http://www.cnblogs.com/tianzhijiexian/p/4020250.html),你可以找到更多关于如何结合使用SAX和PULL解析XML并生成新XML的详细信息。

Global site tag (gtag.js) - Google Analytics