概述
1、Java自身API
JDK的API中主要包含如下的三个包:
javax.xml.*:a、parsers 包中主要包含构造XML文档的两种API方法,如DOM处理方式(DocumentBuilder DocumentBuilderFactory),SAX处理方式(SAXParse SAXParseFactory)。
b、transform包:
javax.xml.transform | 此包定义了用于处理转换指令,以及执行从源到结果的转换的一般 API。 |
javax.xml.transform.dom | 此包实现特定于 DOM 的转换 API。 |
javax.xml.transform.sax | 此包实现特定于 SAX2 的转换 API。 |
javax.xml.transform.stream | 此包实现特定于流和 URI 的转换 API。 |
javax.xml.validation | 此包提供了用于 XML 文档验证的 API。 |
c、XPath处理包:
使用 javax.xml.xpath 的软件包 | |
---|---|
javax.xml.xpath | 此包提供了用于 XPath 表达式的计算和访问计算环境的 object-model neutral API。 |
javax.xml.xpath 使用的 javax.xml.xpath 中的类 | |
---|---|
XPath XPath 提供了对 XPath 计算环境和表达式的访问。 | |
XPathException XPathException 表示一般的 XPath 异常。 | |
XPathExpression XPathExpression 提供了对编译后的 XPath 表达式的访问。 | |
XPathExpressionException XPathExpressionException 表示 XPath 表达式中的错误。 | |
XPathFactory XPathFactory 实例可用于创建 XPath 对象。 | |
XPathFactoryConfigurationException XPathFactoryConfigurationException 表示 XPathFactory 环境中的配置错误。 | |
XPathFunction XPathFunction 提供了对 XPath 函数的访问。 | |
XPathFunctionException XPathFunctionException 表示 XPath 函数的错误。 | |
XPathFunctionResolver XPathFunctionResolver 提供了对用户定义的 XPathFunction 集的访问。 | |
XPathVariableResolver XPathVariableResolver 提供了对用户定义的 XPath 变量集的访问。 |
org.w3c.dom.*:
此包的使用,需要的类如下:
使用 org.w3c.dom 的软件包 | |
---|---|
javax.imageio.metadata | 用于处理读写元数据的 Java Image I/O API 的包。 |
javax.xml.parsers | 提供允许处理 XML 文档的类。 |
javax.xml.transform.dom | 此包实现特定于 DOM 的转换 API。 |
javax.xml.validation | 此包提供了用于 XML 文档验证的 API。 |
org.w3c.dom | 为文档对象模型 (DOM) 提供接口,该模型是 Java API for XML Processing 的组件 API。 |
org.w3c.dom.bootstrap | |
org.w3c.dom.events | |
org.w3c.dom.ls |
用于包装XML对象的常用类如下:
- org.w3c.dom.DOMConfiguration
- org.w3c.dom.DOMError
- org.w3c.dom.DOMErrorHandler
- org.w3c.dom.DOMImplementation
- org.w3c.dom.DOMImplementationList
- org.w3c.dom.DOMImplementationSource
- org.w3c.dom.DOMLocator
- org.w3c.dom.DOMStringList
- org.w3c.dom.NamedNodeMap
- org.w3c.dom.NameList
- org.w3c.dom.Node
- org.w3c.dom.Attr
- org.w3c.dom.CharacterData
- org.w3c.dom.Comment
- org.w3c.dom.Text
- org.w3c.dom.CDATASection
- org.w3c.dom.Document
- org.w3c.dom.DocumentFragment
- org.w3c.dom.DocumentType
- org.w3c.dom.Element
- org.w3c.dom.Entity
- org.w3c.dom.EntityReference
- org.w3c.dom.Notation
- org.w3c.dom.ProcessingInstruction
- org.w3c.dom.NodeList
- org.w3c.dom.TypeInfo
- org.w3c.dom.UserDataHandler
org.xml.sax.*:
- org.xml.sax.AttributeList
- org.xml.sax.Attributes
- org.xml.sax.ContentHandler
- org.xml.sax.DocumentHandler
- org.xml.sax.DTDHandler
- org.xml.sax.EntityResolver
- org.xml.sax.ErrorHandler
- org.xml.sax.Locator
- org.xml.sax.Parser
- org.xml.sax.XMLReader
- org.xml.sax.XMLFilter
2、JDOM理解
3、DOM4J理解
二、java中四种操作xml方式的比较
1. 介
. 介绍
1)DOM(JAXP Crimson解析器)
DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准。DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的。DOM以及广义的基于树的处理具有几个优点。首先,由于树在内存中是持久的,因此可以修改它以便应用程序能对数据和结构作出更改。它还可以在任何时候在树中上下导航,而不是像SAX那样是一次性的处理。DOM使用起来也要简单得多。
2)SAX
SAX处理的优点非常类似于流媒体的优点。分析能够立即开始,而不是等待所有的数据被处理。而且,由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中。这对于大型文档来说是个巨大的优点。事实上,应用程序甚至不必解析整个文档;它可以在某个条件得到满足时停止解析。一般来说,SAX还比它的替代者DOM快许多。
选择DOM还是选择SAX? 对于需要自己编写代码来处理XML文档的开发人员来说, 选择DOM还是SAX解析模型是一个非常重要的设计决策。 DOM采用建立树形结构的方式访问XML文档,而SAX采用的事件模型。
DOM解析器把XML文档转化为一个包含其内容的树,并可以对树进行遍历。用DOM解析模型的优点是编程容易,开发人员只需要调用建树的指令,然后利用navigation APIs访问所需的树节点来完成任务。可以很容易的添加和修改树中的元素。然而由于使用DOM解析器的时候需要处理整个XML文档,所以对性能和内存的要求比较高,尤其是遇到很大的XML文件的时候。由于它的遍历能力,DOM解析器常用于XML文档需要频繁的改变的服务中。
SAX解析器采用了基于事件的模型,它在解析XML文档的时候可以触发一系列的事件,当发现给定的tag的时候,它可以激活一个回调方法,告诉该方法制定的标签已经找到。SAX对内存的要求通常会比较低,因为它让开发人员自己来决定所要处理的tag。特别是当开发人员只需要处理文档中所包含的部分数据时,SAX这种扩展能力得到了更好的体现。但用SAX解析器的时候编码工作会比较困难,而且很难同时访问同一个文档中的多处不同数据。
3)JDOM http://www.jdom.org
JDOM的目的是成为Java特定文档模型,它简化与XML的交互并且比使用DOM实现更快。由于是第一个Java特定模型,JDOM一直得到大力推广和促进。正在考虑通过“Java规范请求JSR-102”将它最终用作“Java标准扩展”。从2000年初就已经开始了JDOM开发。
JDOM与DOM主要有两方面不同。首先,JDOM仅使用具体类而不使用接口。这在某些方面简化了API,但是也限制了灵活性。第二,API大量使用了Collections类,简化了那些已经熟悉这些类的Java开发者的使用。
JDOM文档声明其目的是“使用20%(或更少)的精力解决80%(或更多)Java/XML问题”(根据学习曲线假定为20%)。JDOM对于大多数Java/XML应用程序来说当然是有用的,并且大多数开发者发现API比DOM容易理解得多。JDOM还包括对程序行为的相当广泛检查以防止用户做任何在XML中无意义的事。然而,它仍需要您充分理解XML以便做一些超出基本的工作(或者甚至理解某些情况下的错误)。这也许是比学习DOM或JDOM接口都更有意义的工作。
JDOM自身不包含解析器。它通常使用SAX2解析器来解析和验证输入XML文档(尽管它还可以将以前构造的DOM表示作为输入)。它包含一些转换器以将JDOM表示输出成SAX2事件流、DOM模型或XML文本文档。JDOM是在Apache许可证变体下发布的开放源码。
4)DOM4J http://dom4j.sourceforge.net
虽然DOM4J代表了完全独立的开发结果,但最初,它是JDOM的一种智能分支。它合并了许多超出基本XML文档表示的功能,包括集成的XPath支持、XML Schema支持以及用于大文档或流化文档的基于事件的处理。它还提供了构建文档表示的选项,它通过DOM4J API和标准DOM接口具有并行访问功能。从2000下半年开始,它就一直处于开发之中。
为支持所有这些功能,DOM4J使用接口和抽象基本类方法。DOM4J大量使用了API中的Collections类,但是在许多情况下,它还提供一些替代方法以允许更好的性能或更直接的编码方法。直接好处是,虽然DOM4J付出了更复杂的API的代价,但是它提供了比JDOM大得多的灵活性。
在添加灵活性、XPath集成和对大文档处理的目标时,DOM4J的目标与JDOM是一样的:针对Java开发者的易用性和直观操作。它还致力于成为比JDOM更完整的解决方案,实现在本质上处理所有Java/XML问题的目标。在完成该目标时,它比JDOM更少强调防止不正确的应用程序行为。
DOM4J是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件。如今你可以看到越来越多的Java软件都在使用DOM4J来读写XML,特别值得一提的是连Sun的JAXM也在用DOM4J。
2.. 比较
1)DOM4J性能最好,连Sun的JAXM也在用DOM4J。目前许多开源项目中大量采用DOM4J,例如大名鼎鼎的Hibernate也用DOM4J来读取XML配置文件。如果不考虑可移植性,那就采用DOM4J.
2)JDOM和DOM在性能测试时表现不佳,在测试10M文档时内存溢出。在小文档情况下还值得考虑使用DOM和JDOM。虽然JDOM的开发者已经说明他们期望在正式发行版前专注性能问题,但是从性能观点来看,它确实没有值得推荐之处。另外,DOM仍是一个非常好的选择。DOM实现广泛应用于多种编程语言。它还是许多其它与XML相关的标准的基础,因为它正式获得W3C推荐(与基于非标准的Java模型相对),所以在某些类型的项目中可能也需要它(如在JavaScript中使用DOM)。
3)SAX表现较好,这要依赖于它特定的解析方式-事件驱动。一个SAX检测即将到来的XML流,但并没有载入到内存(当然当XML流被读入时,会有部分文档暂时隐藏在内存中)。
3. 四种xml操作方式的基本使用方法
xml文件:
<?xml version="1.0" encoding="GB2312"?>
<RESULT>
<VALUE>
<NO>A1234</NO>
<ADDR>四川省XX县XX镇XX路X段XX号</ADDR>
</VALUE>
<VALUE>
<NO>B1234</NO>
<ADDR>四川省XX市XX乡XX村XX组</ADDR>
</VALUE>
</RESULT>
1)DOM
import java.io.*;
import java.util.*;
import org.w3c.dom.*;
import javax.xml.parsers.*;
public class MyXMLReader{
public static void main(String arge[]){
long lasting =System.currentTimeMillis();
try{
File f=new File("data_10k.xml");
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
DocumentBuilder builder=factory.newDocumentBuilder();
Document doc = builder.parse(f);
NodeList nl = doc.getElementsByTagName("VALUE");
for (int i=0;i<nl.getLength();i++){
System.out.print("车牌号码:" + doc.getElementsByTagName("NO").item(i).getFirstChild().getNodeValue());
System.out.println("车主地址:" + doc.getElementsByTagName("ADDR").item(i).getFirstChild().getNodeValue());
}
}catch(Exception e){
e.printStackTrace();
}
2)SAX
import org.xml.sax.*;
import org.xml.sax.helpers.*;
import javax.xml.parsers.*;
public class MyXMLReader extends DefaultHandler {
java.util.Stack tags = new java.util.Stack();
public MyXMLReader() {
super();
}
public static void main(String args[]) {
long lasting = System.currentTimeMillis();
try {
SAXParserFactory sf = SAXParserFactory.newInstance();
SAXParser sp = sf.newSAXParser();
MyXMLReader reader = new MyXMLReader();
sp.parse(new InputSource("data_10k.xml"), reader);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("运行时间:" + (System.currentTimeMillis() - lasting) + "毫秒");}
public void characters(char ch[], int start, int length) throws SAXException {
String tag = (String) tags.peek();
if (tag.equals("NO")) {
System.out.print("车牌号码:" + new String(ch, start, length));
}
if (tag.equals("ADDR")) {
System.out.println("地址:" + new String(ch, start, length));
}
}
public void startElement(String uri,String localName,String qName,Attributes attrs) {
tags.push(qName);}
}
3) JDOM
import java.io.*;
import java.util.*;
import org.jdom.*;
import org.jdom.input.*;
public class MyXMLReader {
public static void main(String arge[]) {
long lasting = System.currentTimeMillis();
try {
SAXBuilder builder = new SAXBuilder();
Document doc = builder.build(new File("data_10k.xml"));
Element foo = doc.getRootElement();
List allChildren = foo.getChildren();
for(int i=0;i<allChildren.size();i++) {
System.out.print("车牌号码:" + ((Element)allChildren.get(i)).getChild("NO").getText());
System.out.println("车主地址:" + ((Element)allChildren.get(i)).getChild("ADDR").getText());
}
} catch (Exception e) {
e.printStackTrace();
}
}
4)DOM4J
import java.io.*;
import java.util.*;
import org.dom4j.*;
import org.dom4j.io.*;
public class MyXMLReader {
public static void main(String arge[]) {
long lasting = System.currentTimeMillis();
try {
File f = new File("data_10k.xml");
SAXReader reader = new SAXReader();
Document doc = reader.read(f);
Element root = doc.getRootElement();
Element foo;
for (Iterator i = root.elementIterator("VALUE"); i.hasNext();) {
foo = (Element) i.next();
System.out.print("车牌号码:" + foo.elementText("NO"));
System.out.println("车主地址:" + foo.elementText("ADDR"));
}
} catch (Exception e) {
e.printStackTrace();
}
}
http://developers.sun.com.cn/blog/eric/entry/200704202
使用JAXP处理XML文件
JAXP是Java API for XML Processing的缩写。JAXP API主要的部分在javax.xml.parsers 这个包中。在这个包中,向用户提供了两个最重要的工厂类,SAXParserFactory 和DocumentBuilderFactory,相应地,提供了SAXParser 和DocumentBuilder两个类。 本文介绍如何使用JAXP解析XML文件。
作者简介
贾波,程序员,您可以通过mosaic@hotmail.com与他联系。
简介
JAXP是Java API for XML Processing的缩写。JAXP API主要的部分在javax.xml.parsers 这个包中。在这个包中,向用户提供了两个最重要的工厂类,SAXParserFactory 和DocumentBuilderFactory,相应地,提供了SAXParser 和DocumentBuilder两个类。
SAX是由XML-DEV定义的;DOM是由W3C定义的。让我们来看看这些API库。
- javax.xml.parsers
JAXP API, 定义个SAX和DOM的一个通用接口 - org.w3c.dom
定义了DOM中的所有组件 - org.xml.sax
定义了SAX的所有API - javax.xml.transform
定义了XSLT API,使用它,你可以将XML转化为一般的可视的页面。
SAX指一种"事件驱动"的处理方式,他对XML文件连续地一个对象一个对象地操作,由于它的这个特点,所以它可以用于服务器端或者对速度有特殊要求的地方。
相比较而言DOM是个使用起来更简单些。他是将所有个XML数据全部读到内存里面,然后使用"树"结构将这些数据组织起来,用户可以对XML的数据进行任意的操作。
至于XSLT,我们在这里就不介绍太多,如果感兴趣请参考相应的资料。我们还是先看看SAX。
SAX
SAX的框架轮廓
系统是从SAXParserFactory产生parser的实例开始的。一个parser中包含了一个SAXReader对象,当这个parser调用parse方法的时候,这个reader就调用回调方法已实现这个应用;而这些方法呢?是定义在ContentHandler,ErrorHandler,DTDHandler and EntityResolver接口中的。
以下是对SAX API库的概述:
- SAXParserFactory
SAXParserFactory是一个根据系统属性生成parser实例的一个对象。 - SAXParser
SAXParser是一个定义了不同种类的parser()方法的接口。一般而言,你向parser传XML数据后,使用DefaultHandler再来处理,系统就会调用一些合适的方法来处理XML文件,这样的一种处理方法是最为简单的。 - SAXReader
SAXParser包含了一个SAXReader,通常你是不需要关心它的,但是当你要使用SAXReader的getXMLReader()方法的时候,你就需要配置他。简言之,SAXParser就是一个与SAX事件通讯的处理器,这样,你就可以使用自定义的handler。 - DefaultHandler
DefaultHandler 实现了 ContentHandler, ErrorHandler, DTDHandler, 和EntityResolver 接口 (当然其中有一些null方法), 如果你感兴趣的话,你可以在你的程序中重载它。 - ContentHandler
当读到XML的tag时,就会调用到这个接口中的startDocument, endDocument, startElement, 和 endElement 方法。同时,这个接口还定义了characters 和processingInstruction,方法,分别地,当parser遇到XML的element或者inline processing instruction的时候调用。 - ErrorHandler
当遇到不同类型的错误的时候分别调用相应的"错误"方法,这些方法包括:error,fatalError和warning。 - DTDHandler
该接口所定义的方法只用在处理DTD信息的时候。 - EntityResolver
给接口中的resolveEntity方法只在parser遇到URI标识数据的时候才调用。
更详细地api介绍,请参看SAX的官方API文档。
例子:
在我们这个例子中,我们处理一个xml文件,然后将其值set到对象中。这是一个非常常用的使用情况。以下就是我们需要处理的xml文件。
Test.xml <?xml version="1.0" ?> <customers> <customer> <id>#001</id> <name>Micke</name> <address>Najing</address> </customer> <customer> <id>#002</id> <name>Car</name> <address>Suzhou</address> </customer> <customer> <id>#003</id> <name>Jimmy</name> <address>ChengDu</address> </customer> <customer> <id>#004</id> <name>Henry</name> <address>Xi'an</address> </customer> </customers>
这是一个非常简单的xml文件,customers中间有数个customer,每一个customer中包含三个属性id, name, address。
根据这个xml文件,我们将Date Object设置如下。
/* * Customers.java * Create @ 2004-4-27 22:04:45 * by Jiabo */ import java.util.*; /** * Customers * Create @ 2004-4-27 22:04:45 * by Jiabo */ public class Customers { private Vector customers; public Customers() { customers = new Vector(); } public void addCustomer(Customer customer) { customers.add(customer); } public String toString() { String newline = System.getProperty("line.separator"); StringBuffer buf = new StringBuffer(); for (int i = 0; i < customers.size(); i++) { buf.append(customers.elementAt(i)).append(newline); } return buf.toString(); } } class Customer { private String id; private String name; private String address; /** * @return */ public String getAddress() { return address; } /** * @return */ public String getId() { return id; } /** * @return */ public String getName() { return name; } /** * @param string */ public void setAddress(String string) { address = string; } /** * @param string */ public void setId(String string) { id = string; } /** * @param string */ public void setName(String string) { name = string; } public String toString(){ return "Customer: ID='" + id + "' Name='" + name + "' Address='" + address + "'"; } }
接下来是xml的处理器。
/* * Test.java * Created on 2004-4-10 * by Jiabo */ import java.util.*; import org.xml.sax.*; import org.xml.sax.helpers.DefaultHandler; /** * Test * Create on 2004-4-10 19:20:27 * by Jiabo */ public class Unmarshaller extends DefaultHandler { private Customers customers; private Stack stack; private boolean isStackReadyForText; private Locator locator; /** * init */ public Unmarshaller() { stack = new Stack(); isStackReadyForText = false; } /** * @return customers */ public Customers getCustomers() { return customers; } /** * callbacks */ public void setDocumentLocator(Locator rhs) { locator = rhs; } //========================================== // SAX DocumentHandler methods //========================================== public void startElement( String uri, String sName, String qName, Attributes attrs) { isStackReadyForText = false; if (sName.equals("customers")) { stack.push(new Customers()); } else if (sName.equals("customer")) { stack.push(new Customer()); } else if ( sName.equals("id") || sName.equals("name") || sName.equals("address")) { stack.push(new StringBuffer()); isStackReadyForText = true; } else { } } public void endElement(String namespaceURI, String sName, String qName){ isStackReadyForText = false; Object temp = stack.pop(); if (sName.equals("customers")) { customers = (Customers) temp; } else if (sName.equals("customer")) { ((Customers) stack.peek()).addCustomer((Customer) temp); } else if (sName.equals("id")) { ((Customer) stack.peek()).setId(temp.toString()); } else if (sName.equals("name")) { ((Customer) stack.peek()).setName(temp.toString()); } else if (sName.equals("address")) { ((Customer) stack.peek()).setAddress(temp.toString()); } } public void characters(char[] data, int start, int length) { if (isStackReadyForText == true) { ((StringBuffer) stack.peek()).append(data, start, length); } else { } } }
在这里我们处理xml文件的思路非常简单,就是使用一个栈,遇到"<"表示element的开始,然后就看与我们既定的Data Object的名字是否相符合,符合就new一个该对象,并将其压栈;不符合就什么都不做,sax的处理框架就会自己去处理下一个element。而当遇到"/>"的时候我们还是看的他名字与DataObject的名字是否相符,相符合的话就出栈,然后set进对象里面。如此循环,就处理完了我们上面那个简单得xml文件。
我们需要做的事情就只有这些。其他如何处理的,handler回自己调用相应的startElement,endElement等方法去处理。
以下是程序的入口:
/* * main.java * Create @ 2004-4-27 22:18:41 * by Jiabo */ import java.io.*; import javax.xml.parsers.*; import org.xml.sax.*; /** * main * Create @ 2004-4-27 22:18:41 * by Jiabo */ public class Main { public static void main(String args[]) { Customers customers = null; if (args.length != 1) { System.err.println("Usage: cmd filename"); System.exit(1); } try { Unmarshaller handler = new Unmarshaller(); SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser saxParser = factory.newSAXParser(); File file = new File(args[0]); InputSource src = new InputSource(new FileInputStream(file)); saxParser.parse( src ,handler); customers = handler.getCustomers(); } catch (Throwable t) { t.printStackTrace(); } System.out.println(customers); } }
如前面所述,通过一个工厂方法得到一个SAXParser的实例,然后就可以编译这个xml文件了。这样你就可以得到如下结果:
Customer: ID ='#001' Name='Micke' Address='Najing' Customer: ID ='#002' Name='Car' Address='Suzhou' Customer: ID ='#003' Name='Jimmy' Address='ChengDu' Customer: ID ='#004' Name='Henry' Address='Xi'an'
Sax的系统框架中还有其他得好些方法,读者不妨试试他们是如何使用的,这对以后实战处理xml文件会有很大的方便。
DOM
DOM的框架轮廓
DOM的API概述
一般而言,我们使用javax.xml.parsers.DocumentBuilderFactory来得到DocumentBuilder的一个实例。当然你也可以DocumentBuilder newDocument()方法来得到一个实现了org.w3c.dom.Document接口的空的Document对象。
- DocumentBuilderFactory
它可以根据系统属性生成一个builder实例。 - DocumentBuilder
用于处理生成Document。
更详细地api介绍,请参看DOM的官方API文档。
所以我们可以简单地这样: DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse("test.xml"); 就可以出得到一个Document。
实例:
我们依然处理test.xml。和SAX一样,也需要有paser。其实思路是非常简单而明晰的,上面我们已经说过,DOM是将所有的xml读入内存,以树的结构来处理的,所以呢,对节点的分析就是解决问题的关键,如下。
代码如下:
/* * Test.java * Created on 2004-4-10 * by Jiabo */ import org.w3c.dom.*; /** * Test * Create on 2004-4-10 19:20:27 * by Jiabo */ public class Unmarshaller { public Unmarshaller() { } public Customers UnmarshallCustomers(Node rootNode) { Customers customers = new Customers(); Node n; NodeList nodes = rootNode.getChildNodes(); for (int i = 0; i < nodes.getLength(); i++) { n = nodes.item(i); if (n.getNodeType() == Node.ELEMENT_NODE) { if ("customer".equals(n.getNodeName())) { customers.addCustomer(UnmarshallCustomer(n)); } else { } } } return customers; } public Customer UnmarshallCustomer(Node customerNode) { Customer customer = new Customer(); Node n; NodeList nodes = customerNode.getChildNodes(); for (int i = 0; i < nodes.getLength(); i++) { n = nodes.item(i); if ("id".equals(n.getNodeName())) { customer.setId(UnmarshallText(n)); } else if ("name".equals(n.getNodeName())) { customer.setName(UnmarshallText(n)); } else if ("address".equals(n.getNodeName())) { customer.setAddress(UnmarshallText(n)); } } return customer; } public String UnmarshallText(Node textNode) { StringBuffer buf = new StringBuffer(); Node n; NodeList nodes = textNode.getChildNodes(); for (int i = 0; i < nodes.getLength(); i++) { n = nodes.item(i); if (n.getNodeType() == Node.TEXT_NODE) { buf.append(n.getNodeValue()); } else { } } return buf.toString(); } }
下面是如何驱动DOM去处理xml文件部分。还是先得到一个DocumentBuilderFactory工厂,在用他生成一个DocumentBuilder一个实例,在调用parse方法就可以分析这个xml文件了。
/* * main.java * Create @ 2004-4-27 22:18:41 * by Jiabo */ import java.io.*; import org.w3c.dom.*; import javax.xml.parsers.*; /** * main * Create @ 2004-4-27 22:18:41 * by Jiabo */ public class Main { public static void main(String args[]) { Customers customers = null; Document doc = null; if (args.length != 1) { System.err.println("Usage: cmd filename"); System.exit(1); } try { Unmarshaller handler = new Unmarshaller(); DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); doc = builder.parse( new File(args[0]) ); customers = handler.UnmarshallCustomers(doc.getDocumentElement()); } catch (Throwable t) { t.printStackTrace(); } System.out.println(customers); } }
总结:
这里是对xml处理的一个简介,力求简介,明了,以最快的速度帮助读者入门,所以,没有完整地使用库中的方法。
Xml文件的处理,对于webservice是基础的基础。而SAX和DOM又是xml处理中基础的基础。浊文请读者笑纳。
最后
以上就是酷炫小白菜为你收集整理的Java处理XML学习的全部内容,希望文章能够帮你解决Java处理XML学习所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复