XML文档解主要分为四种解析方式,官方提供的两种分别是:DOM 和 SAX,第三方分别是:JDOM 和 DOM4j

测试用的xml文档:

 <?xml version="1.0" encoding="UTF-8"?>
<user>
<uname type="3">zhangsan</uname>
<uname type="2">王麻子</uname>
<uname>lisi</uname>
<pwd>
123456
<abcd>
aaaaaaa
<uname type="3">zhaoliu</uname>
</abcd>
<uname>wangwu</uname>
</pwd>
</user>

使用DOM解析如下:

 package com.xmldemo;

 import java.io.IOException;
import java.io.InputStream; import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException; public class DomTest { public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
//创建解析的工厂类
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
//创建解析
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
//获取user.xml的文件流 并且需要保证 xml放在src的根目录
InputStream is = DomTest.class.getClassLoader().getResourceAsStream("user.xml");
//创建文档对象模型
Document document = documentBuilder.parse(is);
//获取指定节点的集合
NodeList nodeList = document.getElementsByTagName("uname");
//遍历并获取
for (int i = 0; i < nodeList.getLength(); i++) {
Element element = (Element) nodeList.item(i);
System.out.println(element.getTagName() + "----->" + element.getAttribute("type") + "---->" + element.getTextContent());
} }
}

 以下是SAX方式解析:

 package com.xmldemo;

 import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List; import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler; public class SaxTest {
public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
//创建解析器的工厂类
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
//创建解析器
SAXParser saxParser = saxParserFactory.newSAXParser();
//获取xml文件流
InputStream is = SaxTest.class.getClassLoader().getResourceAsStream("user.xml");
//创建自己的处理类
MyHandle myHandle = new MyHandle();
//直接进行解析
saxParser.parse(is, myHandle); for (int i = 0; i < myHandle.list.size(); i++) {
System.out.println("SaxTest.main()" + myHandle.list.get(i));
}
}
} /**
* 对XMl处理的方法
* @author Bjsxt2013
*
*/
class MyHandle extends DefaultHandler { public List<String> list = new ArrayList<String>(); private String elementName = null; @Override
public void characters(char[] ch, int start, int length) throws SAXException {
//System.out.println("MyHandle.characters()" + new String(ch, start, length));
if (elementName != null && "uname".equals(elementName)) {
//System.out.println(new String(ch, start, length));
list.add(new String(ch, start, length));
}
} @Override
public void endElement(String uri, String localName, String qName) throws SAXException {
//System.out.println("MyHandle.endElement()" + qName);
elementName = null;
} @Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
//System.out.println("MyHandle.startElement()" + qName);
elementName = qName;
} @Override
public void startDocument() throws SAXException {
//System.out.println("MyHandle.startDocument()");
} @Override
public void endDocument() throws SAXException {
//System.out.println("MyHandle.endDocument()");
}
}

以下是JDom方式解析:

 package com.xmldemo;

 import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List; import org.jdom.Attribute;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter; /**
* 1.如何动态生成xml文件
* 2.如何解析xml文件
* 3.如何修改xml文件
*
* 如何快速的解析xml文件
* @author Bjsxt2013
*
*/
public class JdomTest { public static void main(String[] args) throws Exception {
String filePath = System.getProperty("user.dir") + "\\src\\create.xml";
//System.out.println(filePath);
//createXml(filePath);
parserXml(filePath);
} /**
* 解析并修改XMl文件
* @param filePath
* @throws JDOMException
* @throws IOException
*/
public static void parserXml(String filePath) throws JDOMException, IOException {
//创建JDom的解析器
SAXBuilder saxBuilder = new SAXBuilder();
//获取XML对象的流
InputStream is = JdomTest.class.getClassLoader().getResourceAsStream("create.xml");
//解析并生成document对象
Document document = saxBuilder.build(is);
//获取根节点
Element rootElement = document.getRootElement();
//修改根节点的属性
rootElement.setAttribute("sno", "9999");
rootElement.setAttribute("type01", "aaaaaaaaaaaaaa");
Attribute type = new Attribute("type", "abcdefg");
rootElement.setAttribute(type); //获取指定的子节点
Element stuName = rootElement.getChild("stuName");
Element abcd = stuName.getChild("abcd");
//获取节点对应的值
//System.out.println("JdomTest.parserXml()" + abcd.getText());
abcd.setText("唐僧");
//The attribute already has an existing parent "student"
//abcd.setAttribute(type); //获取所有的子节点
List<Element> list = rootElement.getChildren();
for (int i = 0; i < list.size(); i++) {
System.out.println("JdomTest.parserXml()" + list.get(i).getName());
}
//创建新的节点
Element score = new Element("score");
score.setText("99");
rootElement.addContent(score);
//再所有的节点之后设置文本内容 不能直接调用setText方法
//rootElement.setText("abcdefghijklmn");
rootElement.addContent("abcdefghij");
//设置写出的格式
Format format = Format.getPrettyFormat();//格式良好的
//Format format = Format.getCompactFormat();//格式紧凑的
format.setEncoding("utf-8");
//将文档对象模型写出到硬盘
XMLOutputter xmlOutputter = new XMLOutputter(format);
xmlOutputter.output(document, new FileOutputStream(filePath));
} /**
* 创建一个XML文件
* @param filePath
* @throws FileNotFoundException
* @throws IOException
*/
public static void createXml(String filePath) throws FileNotFoundException, IOException {
//创建学生节点(根节点)
Element rootElement = new Element("student");
//添加属性
rootElement.setAttribute("sno", "201209888");
//创建姓名节点
Element stuName = new Element("stuName");
//给姓名节点设置值
stuName.setText("柳岩");
//创建年龄节点
Element age = new Element("age");
age.setText("18");
//将节点连起来
rootElement.addContent(stuName);
rootElement.addContent(age); //创建文档对象模型
Document document = new Document(rootElement);
//设置写出的格式
Format format = Format.getPrettyFormat();//格式良好的
//Format format = Format.getCompactFormat();//格式紧凑的
format.setEncoding("utf-8");
//将文档对象模型写出到硬盘
XMLOutputter xmlOutputter = new XMLOutputter(format);
xmlOutputter.output(document, new FileOutputStream(filePath));
}
}

xml文档解析的更多相关文章

  1. jsoup -- xml文档解析

    jsoup -- xml文档解析 修改 https://jsoup.org/cookbook/modifying-data/set-attributes https://jsoup.org/cookb ...

  2. iOS网络编程笔记——XML文档解析

    今天利用多余时间研究了一下XML文档解析,虽然现在移动端使用的数据格式基本为JSON格式,但是XML格式毕竟多年来一直在各种计算机语言之间使用,是一种老牌的经典的灵活的数据交换格式.所以我认为还是很有 ...

  3. Android XML文档解析(一)——SAX解析

    ---------------------------------------------------------------------------------------------------- ...

  4. JAVA读取XML,JAVA读取XML文档,JAVA解析XML文档,JAVA与XML,XML文档解析(Document Object Model, DOM)

    使用Document Object Model, DOM解析XML文档 也可参考我的新浪博客:http://blog.sina.com.cn/s/blog_43ac5543010190w3.html ...

  5. XML 文档解析操作

    sing System;using System.Data;using System.Configuration;using System.Web;using System.Web.Security; ...

  6. MVC模式简单的Xml文档解析加Vue渲染

    前端代码: <script src="~/Js/jquery-3.3.1.min.js"></script> <script src="~/ ...

  7. 四种生成和解析XML文档的方法详解(介绍+优缺点比较+示例)

    众所周知,现在解析XML的方法越来越多,但主流的方法也就四种,即:DOM.SAX.JDOM和DOM4J 下面首先给出这四种方法的jar包下载地址 DOM:在现在的Java JDK里都自带了,在xml- ...

  8. IOS 解析XML文档

    前段时间想找点事做,就是试着看能不能用豆瓣的API做点什么,于是就碰到了这个问题——XML解析. 老师还没讲,只能自己去查. XML文档解析主要有SAX和DOM两种模式,IOS上两种模式都可以用,这里 ...

  9. SAX解析和生成XML文档

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本人声明.否则将追究法律责任. 作者: 永恒の_☆ 地址: http://blog.csdn.net/chenghui031 ...

随机推荐

  1. hdu 1258 Sum It Up(dfs+去重)

    题目大意: 给你一个总和(total)和一列(list)整数,共n个整数,要求用这些整数相加,使相加的结果等于total,找出所有不相同的拼凑方法. 例如,total = 4,n = 6,list = ...

  2. 第三节 Hello world --python初体验

    祭旗--hello world 据说简单优雅.功能强大是python的魅力所在,这里看到简单了,优雅是什么样的,接下来的学习中慢慢体会吧! print ("Hello world" ...

  3. Activity之间传递参数(四)

    --------siwuxie095 获取Activity的返回参数 1.首先修改两个布局文件,都修改为 LinearLayout 布局, 添加orientation属性为:vertical. (1) ...

  4. js 日期对象Date以及传参

    创建一个日期对象,日期对象可传参new Date() 创建日期对象getFullYear() 获取年份 getMonth() 获取月份 返回值是 0(一月) 到 11(十二月) 之间的一个整数 get ...

  5. MAC 安装 Protobuf

    1.确认MAC装有g++.make.vim工具 2.安装make工具使用       brew install make 3.安装protobuf brew install protobuf 4.安装 ...

  6. Android学习---SQLite数据库的增删改查和事务(transaction)调用

    上一篇文章中介绍了手工拼写sql语句进行数据库的CRUD操作,本文将介绍调用sqlite内置的方法实现CRUD操作,其实质也是通过拼写sql语句. 首先,创建一个新的android项目: 其次,查看代 ...

  7. GUI的搭建,windowbuilder的使用

    在进行GUI的搭建过程中,相信很多人对于一个图标的设置感觉写起来很麻烦,需要不断的添加,而在java中有一个windowbuilder窗口可以很好的帮助我们进行GUI的搭建 1.进入eclipse的页 ...

  8. Java 判断字符串第一位和最后一位,并截取

    public static void main(String[] args) { String str = "\"{\"TaxCode\":\"913 ...

  9. Archlinux 上 Nginx + PHP + Mariadb + DiscuzX2.5 安装小记

    因为不好找下载集成服务器工具,而且他们自己又打包了一份 php 之类的程序,本身系统就已经有 php 还有数据库什么的了再搞一份受不了,最后选择了手动配置…… 这是一个在 Archlinux 上手动从 ...

  10. RHEL7学习之NTP配置

    一,安装NTP [root@localhost ~]# yum install ntp Loaded plugins: product-id, subscription-manager This sy ...