博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java生成和解析XML格式文件和字符串的实例代码【dom4j中的SAXReader对象读取并解析xml文件】
阅读量:2352 次
发布时间:2019-05-10

本文共 8088 字,大约阅读时间需要 26 分钟。

文章来源:

1、基础知识:

Java解析XML一般有四种方法:DOM、SAX、JDOM、DOM4J。

2、使用介绍

1)、DOM
(1)简介

由W3C(org.w3c.dom)提供的接口,它将整个XML文档读入内存,构建一个DOM树来对各个节点(Node)进行操作。优点就是整个文档都一直在内存中,我们可以随时访问任何节点,并且对树的遍历也是比较熟悉的操作;缺点则是耗内存,并且必须等到所有的文档都读入内存才能进行处理。

XML文档示例:

599
CMCC
699
ChinaNet

 

省略......

(3)元素(Element)和结点(Node)的区别(org.w3c.dom)

Node对象是整个文档对象模型的主要数据类型,是DOM中最基本的对象,代表了文档树中的抽象节点。但在实际使用中很少会直接使用Node对象,而是使用Node对象的子对象Element,Attr,Text等。
Element对象表示HTML或XML文档中的一个元素,是Node类最主要的子对象,在元素中可以包含属性,因而Element中有存取其属性的方法。
Element是从Node继承而来的,元素是一个小范围的定义,必须是含有完整信息的结点才是一个元素,例如<div>...</div>。但是一个结点不一定是一个元素,而一个元素一定是一个结点。
node有几个子类型:Element,Text,Attribute,RootElement,Comment,Namespace等

2)、SAX

3)、JDOM(jdom.jar)

src目录下的identity.xml文件结构:

<?xml version="1.0" encoding="UTF-8"?>

<root>
 <person id="1">
  <username>张三</username>
  <password>123123</password>
 </person>
 <person id="2">
  <username>1111111112</username>
  <password>password2</password>
 </person>
</root>

示例代码:

import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.util.List;import org.jdom.Document;import org.jdom.Element;import org.jdom.JDOMException;import org.jdom.input.SAXBuilder;import org.jdom.output.XMLOutputter;public class testjj {	//XML文件放在src目录下	//解析XML文件	private static void parseXml() throws JDOMException, IOException {		SAXBuilder sb=new SAXBuilder();//		File file=new File("");		InputStream is=testjj.class.getResourceAsStream("/identity.xml");//建议写法				Document doc=sb.build(is);//获得文档对象		Element root=doc.getRootElement();//获得根节点		List
list=root.getChildren(); for(Element e:list){ System.out.println("ID="+e.getAttributeValue("id")); System.out.println("username="+e.getChildText("username")); System.out.println("password="+e.getChildText("password")); } } //增 public static void addXml() throws JDOMException, FileNotFoundException, IOException { SAXBuilder builder = new SAXBuilder(); InputStream is=testjj.class.getResourceAsStream("/identity.xml");//建议写法 Document doc = builder.build(is);//获得文档对象 Element root = doc.getRootElement();//获得根节点 //添加新元素 Element element = new Element("person"); element.setAttribute("id", "3"); Element element1 = new Element("username"); element1.setText("zhangdaihao"); Element element2 = new Element("password"); element2.setText("mima"); element.addContent(element1); element.addContent(element2); root.addContent(element); doc.setRootElement(root); //文件处理 XMLOutputter out = new XMLOutputter(); out.output(doc, new FileOutputStream("src/identity.xml")); } //根据ID值删除一个节点 public static void deletePerson(int id) throws JDOMException, IOException { SAXBuilder builder = new SAXBuilder(); InputStream is=testjj.class.getResourceAsStream("/identity.xml"); Document doc = builder.build(is);//获得文档对象 Element root = doc.getRootElement();//获得根节点 List
list = root.getChildren(); for(Element e:list) { //获取ID值 if(Integer.parseInt(e.getAttributeValue("id"))==id) { root.removeContent(e); break;//?? } } //文件处理 XMLOutputter out = new XMLOutputter(); out.output(doc, new FileOutputStream("src/identity.xml")); } //根据ID值修改一个节点 public static void updatePerson(int id) throws JDOMException, IOException { SAXBuilder builder = new SAXBuilder(); InputStream is=testjj.class.getResourceAsStream("/identity.xml"); Document doc = builder.build(is);//获得文档对象 Element root = doc.getRootElement();//获得根节点 List
list = root.getChildren(); for(Element e:list) { //获取ID值 if(Integer.parseInt(e.getAttributeValue("id"))==id) { System.out.println("--------------------"); e.getChild("username").setText("111111111"); e.getChild("password").setText("password"); } } //文件处理 XMLOutputter out = new XMLOutputter(); out.output(doc, new FileOutputStream("src/identity.xml")); } public static void main(String[] args) { try {// addXml(); //deletePerson(3); updatePerson(3); parseXml(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (JDOMException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }}

4)、DOM4J(dom4j.jar)

(1)简介
dom4j是目前在xml解析方面是最优秀的(Hibernate、Sun的JAXM也都使用dom4j来解析XML),它合并了许多超出基本XML文档表示的功能,包括集成的XPath支持、XML Schema支持以及用于大文档或流化文档的基于事件的处理。
在使用XPATH时要增加jaxen.jar,否则会出现如下错误:

代码如下:

Exception in thread "main" java.lang.NoClassDefFoundError: org/jaxen/JaxenExceptionat org.dom4j.DocumentFactory.createXPath(DocumentFactory.java:230)at org.dom4j.tree.AbstractNode.createXPath(AbstractNode.java:207)      at org.dom4j.tree.AbstractNode.selectNodes(AbstractNode.java:164)

(2)示例代码:

package nc.util;import java.io.File;import java.io.FileWriter;import java.io.IOException;import java.io.StringReader;import java.io.StringWriter;import java.util.List;import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.DocumentHelper;import org.dom4j.Element;import org.dom4j.io.OutputFormat;import org.dom4j.io.SAXReader;import org.dom4j.io.XMLWriter;import org.junit.Test;import org.xml.sax.InputSource;public class XMLHandler {	public XMLHandler(){	}	@Test	public String createXML(){		String strXML=null;		//		Document document=DocumentHelper.createDocument();		Element root=document.addElement("root");		Element phone=root.addElement("TelePhone");				Element nokia=phone.addElement("type");		nokia.addAttribute("name", "nokia");		Element price_nokia=nokia.addElement("price");		price_nokia.addText("599");		Element operator_nokia=nokia.addElement("operator");		operator_nokia.addText("CMCC");				Element xiaomi=phone.addElement("type");		xiaomi.addAttribute("name","xiaomi");		Element price_xiaomi=xiaomi.addElement("price");		price_xiaomi.addText("699");		Element operator_xiaomi=xiaomi.addElement("operator");		operator_xiaomi.addText("ChinaNet");				//核心为document  XMLWriter				StringWriter strWriter=new StringWriter();		OutputFormat format=OutputFormat.createPrettyPrint();		format.setEncoding("utf-8");		//作用:构建XML文件结构,写到StringWriter?		XMLWriter xmlWriter=new XMLWriter(strWriter, format);		try {			xmlWriter.write(document);					} catch (IOException e) {			e.printStackTrace();		}		strXML=strWriter.toString();System.out.println("strxml===="+strXML);				//strXML=document.asXML();//System.err.println("document===="+strXML);					//输出		File file=new File("telephone.xml");		if(file.exists()){			file.delete();		}				try {			file.createNewFile();			XMLWriter out=new XMLWriter(new FileWriter(file));			out.write(document);			out.flush();			out.close();		} catch (IOException e) {			e.printStackTrace();		}				return strXML;	}	/**	 * 解析XML格式的字符串	 */	private  void parserXML(String strXML) {		SAXReader reader=new SAXReader();				StringReader strReader=new StringReader(strXML);		InputSource source=new InputSource(strReader);		try {			Document document=reader.read(source);//System.out.println(document.asXML());			Element root=document.getRootElement();			//get element    方法elements("节点标识");获取属性值element.attributeValue("节点标识")			List
phoneList=root.elements("TelePhone"); List
typeList=phoneList.get(0).elements("type"); for(int i=0;i
childList=element.elements(); for(Element e:childList){ System.out.println(e.getText()); } } } catch (DocumentException e) { e.printStackTrace(); } } /** * 解析XML格式的字符串 */ private void parseXMLbyXPath(String strXML) { SAXReader reader = new SAXReader(); StringReader strReader=new StringReader(strXML); InputSource source=new InputSource(strReader); try { Document document=reader.read(source); List
list=document.selectNodes("/root/TelePhone/type"); for(int i=0;i

5)XPATH

(1)简介
XPath是一门在XML文档中查找信息的语言。XPath用于在XML文档中通过元素和属性进行导航。
具体语法介绍参考:http://w3school.com.cn/xpath/index.asp

省略......

上一篇:

下一篇:

 

 

 

 

 

 

 

转载地址:http://bygvb.baihongyu.com/

你可能感兴趣的文章
Android 代码混淆异常
查看>>
Android drawable微技巧,你所不知道的drawable的那些细节
查看>>
理解Fragment生命周期
查看>>
最靠谱的禁止ViewPager滑动方法
查看>>
android错误之android.content.res.Resources$NotFoundException:
查看>>
Android监听软键盘打开收起事件(软键盘自带收起按钮)
查看>>
huffman code and encode
查看>>
exception in c++
查看>>
java并发编程lock
查看>>
阿里云技术教程系列-ECS远程连接 Linux 实例
查看>>
Linux新建用户并允许docker
查看>>
Drools Workbench 7.5.0.Final安装运行
查看>>
Docker快速部署Redis
查看>>
Spring boot shiro session cache ecache redis 共存配置
查看>>
一看就懂的设计模式--设计模式分类
查看>>
一看就懂的设计模式--模板方法
查看>>
一看就懂的设计模式--享元模式
查看>>
一看就懂的设计模式--策略模式
查看>>
spring Cloud 组建图
查看>>
腾讯云
查看>>