我是靠谱客的博主 酷炫小白菜,最近开发中收集的这篇文章主要介绍Java处理XML学习,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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学习所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部