java读取解析xml文件实例

读取本地的xml文件,通过DOM进行解析,DOM解析的特点就是把整个xml文件装载入内存中,形成一颗DOM树形结构,树结构是方便遍历和和操纵。

DOM解析的特性就是读取xml文件转换为 dom树形结构,通过节点进行遍历。

这是W3c关于节点的概念

如果xml中包含有大量的数据,由于dom一次性把xml装入内存中的特性,所以dom不适合于包含大量数据的xml解析。当包含有大量xml的时候,用SAX进行解析比较节省内存。

下面是一个运用DOM进行解析xml文件的例子:

xml文件结构如下:

<?xml version="1.0" encoding="ISO-8859-1"?>
<bookstore>
 <book category="cooking">
 <title lang="en">Everyday Italian</title>
 <author>Giada De Laurentiis</author>
 <year>2005</year>
 <price>30.00</price>
 </book>
 <book category="children">
 <title lang="en">Harry Potter</title>
 <author>J K. Rowling</author>
 <year>2005</year>
 <price>29.99</price>
 </book>
 <book category="web">
 <title lang="en">XQuery Kick Start</title>
 <author>James McGovern</author>
 <year>2003</year>
 <price>49.99</price>
 </book>
 <book category="web" cover="paperback">
 <title lang="en">Learning XML</title>
 <author>Erik T. Ray</author>
 <year>2003</year>
 <price>39.95</price>
 </book>
</bookstore>

创建解析xml的类如下:

package xml.dom;

import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class ReadXmlFile {

 public static void main(String[] args) {

 try{

  File xmlFile = new File("src/resource/book.xml");

  DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();

  DocumentBuilder builder = builderFactory.newDocumentBuilder();

  Document doc = builder.parse(xmlFile);

  doc.getDocumentElement().normalize();

  System.out.println("Root element: "+doc.getDocumentElement().getNodeName());

  NodeList nList = doc.getElementsByTagName("book");

  for(int i = 0 ; i<nList.getLength();i++){

  Node node = nList.item(i);

  System.out.println("Node name: "+ node.getNodeName());
  Element ele = (Element)node;

  System.out.println("----------------------------");
  if(node.getNodeType() == Element.ELEMENT_NODE){

  System.out.println("book category: "+ ele.getAttribute("category"));

  System.out.println("title name: "+ ele.getElementsByTagName("title").item(0).getTextContent());

  System.out.println("author name: "+ele.getElementsByTagName("author").item(0).getTextContent());

  System.out.println("year :"+ele.getElementsByTagName("year").item(0).getTextContent());

  System.out.println("price : "+ele.getElementsByTagName("price").item(0).getTextContent());

  System.out.println("-------------------------");

  }

  }

解析结果:

Root element: bookstore
Node name: book
----------------------------
book category: cooking
title name: Everyday Italian
author name: Giada De Laurentiis
year :2005
price : 30.00
-------------------------
Node name: book
----------------------------
book category: children
title name: Harry Potter
author name: J K. Rowling
year :2005
price : 29.99
-------------------------
Node name: book
----------------------------
book category: web
title name: XQuery Kick Start
author name: James McGovern
year :2003
price : 49.99
-------------------------
Node name: book
----------------------------
book category: web
title name: Learning XML
author name: Erik T. Ray
year :2003
price : 39.95
-------------------------

以上是通过name获得对应的值,
下面利用循环节点的方式输出:
循环节点输出方式的代码如下:

package xml.dom;

import java.io.File;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class ReadXmlFile2 {

 public static void main(String[] args) {
 try{

  File xmlFile = new File("src/resource/book.xml");

  DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();

  DocumentBuilder builder = builderFactory.newDocumentBuilder();

  Document doc = builder.parse(xmlFile);

  doc.getDocumentElement().normalize();

  System.out.println("Root element: "+doc.getDocumentElement().getNodeName());

  if(doc.hasChildNodes()){

  printNode(doc.getChildNodes());
  }
 }catch(Exception e){

 e.printStackTrace();

 }

 }

 public static void printNode(NodeList nodeList){
 System.out.println("------------------------");
 // System.out.println(nodeList.getLength());
 for(int i = 0; i<nodeList.getLength(); i++){

 Node node = (Node)nodeList.item(i);

 if(node.getNodeType() == Node.ELEMENT_NODE){

 System.out.println("node name: "+node.getNodeName());

 System.out.println("node value: "+node.getTextContent());

 if(node.hasAttributes()){
  NamedNodeMap nodeMap = node.getAttributes();

  for(int j = 0; j < nodeMap.getLength() ; j++){

  Node nodenew = nodeMap.item(j);

  System.out.println("node name "+nodenew.getNodeName());
  System.out.println("node value "+nodenew.getNodeValue());
  }
 }
 if(node.hasChildNodes()){
  printNode(node.getChildNodes());
 }
 }

 }

 }

}

输出结果如下:

Root element: bookstore
------------------------
node name: bookstore
node value: 

 Everyday Italian
 Giada De Laurentiis
 2005
 30.00

 Harry Potter
 J K. Rowling
 2005
 29.99

 XQuery Kick Start
 James McGovern
 2003
 49.99

 Learning XML
 Erik T. Ray
 2003
 39.95

------------------------
node name: book
node value:
 Everyday Italian
 Giada De Laurentiis
 2005
 30.00

node name category
node value cooking
------------------------
node name: title
node value: Everyday Italian
node name lang
node value en
------------------------
node name: author
node value: Giada De Laurentiis
------------------------
node name: year
node value: 2005
------------------------
node name: price
node value: 30.00
------------------------
node name: book
node value:
 Harry Potter
 J K. Rowling
 2005
 29.99

node name category
node value children
------------------------
node name: title
node value: Harry Potter
node name lang
node value en
------------------------
node name: author
node value: J K. Rowling
------------------------
node name: year
node value: 2005
------------------------
node name: price
node value: 29.99
------------------------
node name: book
node value:
 XQuery Kick Start
 James McGovern
 2003
 49.99

node name category
node value web
------------------------
node name: title
node value: XQuery Kick Start
node name lang
node value en
------------------------
node name: author
node value: James McGovern
------------------------
node name: year
node value: 2003
------------------------
node name: price
node value: 49.99
------------------------
node name: book
node value:
 Learning XML
 Erik T. Ray
 2003
 39.95

node name category
node value web
node name cover
node value paperback
------------------------
node name: title
node value: Learning XML
node name lang
node value en
------------------------
node name: author
node value: Erik T. Ray
------------------------
node name: year
node value: 2003
------------------------
node name: price
node value: 39.95
------------------------

关于节点的问题:

 <book category="cooking">
 <title lang="en">Everyday Italian</title>
 <author>Giada De Laurentiis</author>
 <year>2005</year>
 <price>30.00</price>
 </book>

对于 book应用:doc.getChildNodes() 得到一个NodeList其中NodeList的长度为9
9个节点分别如下:
title节点
lang节点 
Everyday节点
 author节点
Giada De Laurentiis节点
 year节点
 2005节点
 price节点
 30.00节点

PS:这里再为大家提供几款关于xml操作的在线工具供大家参考使用:

在线XML/JSON互相转换工具:
http://tools.jb51.net/code/xmljson

在线格式化XML/在线压缩XML:
http://tools.jb51.net/code/xmlformat

XML在线压缩/格式化工具:
http://tools.jb51.net/code/xml_format_compress

(0)

相关推荐

  • java正则表达式验证邮箱、电话号码示例

    下面的代码使用正则表达式验证输入格式包括了验证邮箱和验证手机号码 复制代码 代码如下: package com.firewolf.utils; import java.util.regex.Matcher; import java.util.regex.Pattern; /**  * 使用正则表达式验证输入格式  * @author liuxing  *  */ public class RegexValidateUtil {  public static void main(String[]

  • Java使用正则表达式截取重复出现的XML字符串功能示例

    本文实例讲述了Java使用正则表达式截取重复出现的XML字符串功能.分享给大家供大家参考,具体如下: public static void main(String[] args) throws DocumentException { String s = "<MTCCommand Time=\"2014-03-22\"><Login UserId=\"admin\" UserPasswd=\"123\" />&l

  • java中 利用正则表达式提取( )内内容

    昨天遇到一个小问题,需要批量处理一些用户,而前台传来的用户格式如下,要提取括号中间的内容(不带括号) 教师10(0010)教师11(0011)教师9(009)教师12(0012)教师13(0013)教师14(0014) 本来想用java的String.split()和substring()来搞定,但是需要处理多次比较麻烦,就用正则表达式了.虽然语法忘得差不多了,但是印象中用断言比较方便(关键希望结果不带括号).打开RegexBuddy试了下,轻松搞定:下边是java实现代码: 复制代码 代码如下

  • java操作(DOM、SAX、JDOM、DOM4J)xml方式的四种比较与详解

    1)DOM(JAXP Crimson解析器) DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准.DOM是以层次结构组织的节点或信息片断的集合.这个层次结构允许开发人员在树中寻找特定信息.分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作.由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的.DOM以及广义的基于树的处理具有几个优点.首先,由于树在内存中是持久的,因此可以修改它以便应用程序能对数据和结构作出更改.它还可以在任何时候在树中上下导航,而不是像SAX那

  • Java如何读取XML文件 具体实现

    今天的CSDN常见问题来讲解下在Java中如何读取XML文件的内容. 直接上代码吧,注释写的很清楚了! 复制代码 代码如下: import java.io.*;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.Node;im

  • java解析XML几种方式小结

    java解析XML几种方式小结 第一种:DOM. DOM的全称是Document Object Model,也即文档对象模型.在应用程序中,基于DOM的XML分析器将一个XML文档转换成一个对象模型的集合(通常称DOM树),应用程序正是通过对这个对象模型的操作,来实现对XML文档数据的操作.通过DOM接口,应用程序可以在任何时候访问XML文档中的任何一部分数据,因此,这种利用DOM接口的机制也被称作随机访问机制. DOM接口提供了一种通过分层对象模型来访问XML文档信息的方式,这些分层对象模型依

  • Java生成和解析XML格式文件和字符串的实例代码

    1.基础知识: Java解析XML一般有四种方法:DOM.SAX.JDOM.DOM4J. 2.使用介绍 1).DOM (1)简介 由W3C(org.w3c.dom)提供的接口,它将整个XML文档读入内存,构建一个DOM树来对各个节点(Node)进行操作.优点就是整个文档都一直在内存中,我们可以随时访问任何节点,并且对树的遍历也是比较熟悉的操作:缺点则是耗内存,并且必须等到所有的文档都读入内存才能进行处理. (2)示例代码: 复制代码 代码如下: <?xml version="1.0&quo

  • Java基于正则表达式实现xml文件的解析功能详解

    本文实例讲述了Java基于正则表达式实现xml文件的解析功能.分享给大家供大家参考,具体如下: 这是我通过正则表达式实现的xml文件解析工具,有些XHTML文件中包含特殊符号,暂时还无法正常使用. 设计思路:常见的xml文件都是单根树结构,工具的目的是通过递归的方式将整个文档树装载进一个Node对象.xml文档树上的每一个节点都能看做一个Node对象,它拥有title.attribute和text三个自身变量以及一个childrenNode集合用来存放子节点,使用正则表达式完整装载. 一.编写N

  • java使用xpath解析xml示例分享

    XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言.XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力.起初 XPath 的提出的初衷是将其作为一个通用的.介于XPointer与XSL间的语法模型.但是 XPath 很快的被开发者采用来当作小型查询语言. XPathTest.java 复制代码 代码如下: package com.hongyuan.test; import java.io.File;import java

  • Java使用正则表达式提取XML节点内容的方法示例

    本文实例讲述了Java使用正则表达式提取XML节点内容的方法.分享给大家供大家参考,具体如下: 现在有类似<doc>abc</doc><title>3232</title> <doc>只要内容</doc>这么一个串,需要提取abc,3232,只要内容的节点内容 public static List getContext(String html) { List resultList = new ArrayList(); Pattern

  • java中使用sax解析xml的解决方法

    在java中,原生解析xml文档的方式有两种,分别是:Dom解析和Sax解析 Dom解析功能强大,可增删改查,操作时会将xml文档以文档对象的方式读取到内存中,因此适用于小文档 Sax解析是从头到尾逐行逐个元素读取内容,修改较为不便,但适用于只读的大文档 本文主要讲解Sax解析,其余放在后面 Sax采用事件驱动的方式解析文档.简单点说,如同在电影院看电影一样,从头到尾看一遍就完了,不能回退(Dom可来来回回读取) 在看电影的过程中,每遇到一个情节,一段泪水,一次擦肩,你都会调动大脑和神经去接收或

随机推荐