这两天在用java做XML解析的时候遇到了一个比较棘手的问题
由于我需要将xml写入文件,于是乎我在工程中到如了第三方包crimon.jar
<TR>
<TD valign="top" nowrap="">
<P>02320403012447</P></TD>
<TD valign="top" nowrap="">
<P>黄陈菊</P></TD>
<TD valign="top" nowrap="">
<P>河海大学</P></TD>
<TD valign="top" nowrap="">
<P>广播电视新闻学</P></TD>
<TD valign="top" nowrap="">
<P>本科一批</P></TD>
<TD valign="top" nowrap="">
<P>第一志愿</P></TD>
<TD valign="top" nowrap="">
<P>统招</P></TD>
<TD valign="top" nowrap="">
<P>16-Aug-02 00:00:00</P></TD>
<TD valign="top" nowrap="">
<P>571</P></TD>
<TD valign="top" nowrap="">
<P>571</P></TD></TR>
<TR>
我想获取其中的名字,于是乎我进行了
如此解析:
首先进行解析工厂的初始化,并获得dom
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
db = dbf.newDocumentBuilder();
Document doc = db.parse(new File("**.xml"));
Element root = document.getDocumentElement();
。。。。
在顺利获得了包含名字的<P>节点后,假设为Element p
String name=p.getChildNodes().item(1).getTextContent();
我想这样就能解析出名字了,但程序却一直报出如下错误
Exception in thread "main" java.lang.AbstractMethodError: org.apache.crimson.tree.ElementNode.getTextContent()Ljava/lang/String;
这个问题很诡异,因为Node明明就有getTextContent()方法啊,怎么会报错呢。。。
看样子一开始获得Document对象的时候就错了,难道生成的工厂错了
于是乎,我打印工厂看看
System.out.println(dbf);
结果:
org.apache.crimson.jaxp.DocumentBuilderFactoryImpl@fd13b5
奇怪。。。。。怎么会出现crimon的字眼,我明明就是用的jdk自带的工厂啊。。。。应该这样的结果才对啊com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl@76cbf7
后来我通过阅读JAXP的源码才知道,工厂类首先会根据java系统属性进行寻找,然后在根据JRE\lib\jaxp.properties中定义的实现类寻找,最后什么都找不到的话,就用Crimson。注意Crimons是由Bootstrap Class Loader来load的,如果你不通过上面两个方法来改变工厂的寻找顺序,那么铁定用Crimson了,看样子这才是问题出现的原因
于是,我在程序中添加了这么一行
System.setProperty("javax.xml.parsers.DocumentBuilderFactory","com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl");
问题迎刃而解。。。。
既然有了Xerces的实现,那为什么还要Crimson呢,后来在别人博客中找到如下解释:
Crimson来自于Sun捐赠给Apache的ProjectX项目,Xerces来自IBM捐赠给Apache的XML4J项目,结果Xerces胜出,成了Apache XML小组全力开发的XML API,而Crimon已经早就不做了,如今Xerces名满天下,到处都是在用Xerces DOM和SAX解析器,只有Sun不服气,非要在JDK1.4里面使用过时的Crimson,让人感觉像是在赌气一样,真是让人可怜又可气!不过IBM发行JDK用的XML 解析器自然是Xerces。 www.dedecms.com
由于JDK的Class Loader的优先级关系,当你采用JAXP编写XML程序的时候,即使把Xerces包引入CLASSPATH,JDK还是会顽固的使用 Crimson
至此,真相大白!
分享到:
相关推荐
了解`web.xml`的加载顺序和节点解析,有助于我们更有效地配置和管理Web应用程序,确保其在运行时能够按照预期工作。通过合理的配置,我们可以实现诸如初始化资源、拦截请求、处理异常、安全管理等多种功能,提高Web...
- 不支持随机访问:SAX解析器不提供直接访问XML文档任意位置的功能,必须按照顺序处理。 **应用场景** - **DOM** 更适合于需要频繁查询和修改XML文档,且文件大小适中的情况。 - **SAX** 则适用于处理大型XML文件...
DOM解析器将整个XML文件加载到内存中,创建一个树形结构,允许开发者通过节点层级遍历XML文档。在Android中,我们通常使用`javax.xml.parsers.DocumentBuilderFactory`和`org.w3c.dom.Document`类来实现DOM解析。...
【Android XML解析器分析】 XML(Extensible Markup Language)是一种可扩展标记语言,常用于存储和传输结构化数据。在Android应用开发中,XML解析器是处理XML文档的关键工具,主要包括DOM(Document Object Model...
在Web.xml文件中,配置元素的物理顺序并不影响加载顺序,例如,监听器(Listener)、过滤器(Filter)和Servlet的加载顺序是固定的:`context-param` -> `listener` -> `filter` -> `servlet`。尽管`filter`和`...
《Web.xml加载顺序解析》 在Web应用开发中,`web.xml`是部署描述符,它定义了应用程序的行为和配置。了解`web.xml`的加载顺序对于优化和调试Web应用程序至关重要。本文将深入探讨`web.xml`的加载流程,以及各个元素...
TinyXML库由六个主要的源代码文件组成,包括`tinyxml.h`(主头文件)、`tinyxml.cpp`(实现文件)、`tinystr.h`(字符串类)、`tinystr.cpp`、`tinyxmlerror.cpp`(错误处理)和`tinyxmlparser.cpp`(解析器)。...
SAX(Simple API for XML)是XML解析的一种方法,它以事件驱动的方式处理XML文档,非常适合处理大体积的XML文件,因为它不需要一次性加载整个文件到内存,而是逐行读取,因此节省了资源。 **SAX解析XML的基本原理:...
接下来,我们需要创建一个`SAXParserFactory`实例,然后使用它来获取`SAXParser`,并设置XML解析器的配置。最后,我们调用`parse()`方法解析XML文件,并传入我们的事件处理器: ```java public static void parse...
DOM解析器会将整个XML文档加载到内存中,形成一个树形结构,便于遍历和操作;而SAX解析器则采用事件驱动的方式,逐行读取XML文档,更适合处理大文件。 在Python中,有多种第三方库用于XML解析,例如lxml和Element...
在Android开发中,XML文件广泛用于布局设计、配置...在实际项目中,还有一种基于SAX的拉式解析库——PULL解析器(Android提供的`XmlPullParser`),它在内存效率和灵活性之间找到了一个平衡点,也是常用的XML解析方法。
本文将深入探讨XML解析中的SAX(Simple API for XML)解析方法,并结合一个具体的Android 4.0网络编程示例进行详细讲解。 SAX解析是一种基于事件驱动的解析方式,它不会一次性加载整个XML文档到内存,而是逐行读取...
它们通常包含了XML解析器的核心实现。`MyXML.h`文件可能会定义一个类,如`XMLParser`,该类包含解析XML文件所需的方法和成员变量。例如,可能会有一个`parseFile`函数,用于打开并解析XML文件,以及一些内部结构来...
DOM(Document Object Model)是XML解析的一种常见方法,它将XML文档视为一个树形结构,允许开发者通过节点操作来遍历和修改XML内容。以下是一个使用Python的`xml.dom.minidom`库进行DOM解析的例子: ```python ...
在Android和Java编程中,处理XML文件是常见的任务,而SAX(Simple API for XML)是一种轻量级、事件驱动的XML解析器,它以流式方式读取XML文档,只在需要时解析内容,因此非常适合处理大体积的XML文件。 SAX解析器...
1. **DOM解析**:Document Object Model(DOM)解析器加载整个XML文档到内存中,创建一个树形结构,允许开发者遍历整个文档。这种方式适合小规模的XML文件,因为会占用大量内存。 2. **SAX解析**:Simple API for ...
DOM解析器将整个XML文档加载到内存中,创建一个树形结构,称为DOM树。每个节点代表XML文档的一部分,通过遍历这个树,开发者可以访问和修改XML文档的任何部分。DOM解析的优点是它可以提供对XML文档的随机访问,但...
本文将详细探讨Spring加载顺序,并结合`@PostConstruct`、`构造方法`以及`@Autowired`等关键注解进行深入解析。 首先,Spring容器在启动时会读取配置文件(如XML或Java配置类),根据配置信息创建Bean的定义。Bean...
DOM解析器将整个XML文档加载到内存中,构建一个树形结构,即DOM树。每个XML元素、属性、文本节点等都有对应的DOM节点。这种方式的优点是能够方便地进行随机访问,因为所有数据都在内存中,但缺点是内存消耗大,不...