xml文档解析
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文档解析的更多相关文章
- jsoup -- xml文档解析
jsoup -- xml文档解析 修改 https://jsoup.org/cookbook/modifying-data/set-attributes https://jsoup.org/cookb ...
- iOS网络编程笔记——XML文档解析
今天利用多余时间研究了一下XML文档解析,虽然现在移动端使用的数据格式基本为JSON格式,但是XML格式毕竟多年来一直在各种计算机语言之间使用,是一种老牌的经典的灵活的数据交换格式.所以我认为还是很有 ...
- Android XML文档解析(一)——SAX解析
---------------------------------------------------------------------------------------------------- ...
- 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 ...
- XML 文档解析操作
sing System;using System.Data;using System.Configuration;using System.Web;using System.Web.Security; ...
- MVC模式简单的Xml文档解析加Vue渲染
前端代码: <script src="~/Js/jquery-3.3.1.min.js"></script> <script src="~/ ...
- 四种生成和解析XML文档的方法详解(介绍+优缺点比较+示例)
众所周知,现在解析XML的方法越来越多,但主流的方法也就四种,即:DOM.SAX.JDOM和DOM4J 下面首先给出这四种方法的jar包下载地址 DOM:在现在的Java JDK里都自带了,在xml- ...
- IOS 解析XML文档
前段时间想找点事做,就是试着看能不能用豆瓣的API做点什么,于是就碰到了这个问题——XML解析. 老师还没讲,只能自己去查. XML文档解析主要有SAX和DOM两种模式,IOS上两种模式都可以用,这里 ...
- SAX解析和生成XML文档
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本人声明.否则将追究法律责任. 作者: 永恒の_☆ 地址: http://blog.csdn.net/chenghui031 ...
随机推荐
- uvm - dut
module dut(clk, rst_n, rxd, rx_dv, txd, tx_en); input clk; input rst_n; :] rxd; input rx_dv; :] txd; ...
- c语言选择排序
简单选择排序是经常用到的一种排序算法. 原理: 1.简单选择排序一句话概括:每次选择无序数列中最小的将其放在有序数列的最后. 2.在简单选择排序中,我们用初始化的数字int a[6]={2,5,6,3 ...
- composer 安装
安装composer wget http://curl.haxx.se/ca/cacert.pem curl -sS https://getcomposer.org/installer | php - ...
- 关于实现Extjs动态加载类的方式实现
Extjs4以前的版本没有动态加载类的方式,这样开发程序的时候加载很多的js会导致加载变慢,由于本人一直使用extjs3的版本进行开发,于是简单实现了一个动态加载类的管理器,使用方式与extjs4的方 ...
- android 异步加载框架 原理完全解析
一.手写异步加载框架MyAsycnTask(核心原理) 1.我为大家手写了一个异步加载框架,涵盖了异步加载框架核心原理. MyAsycnTask.java import android.os.Hand ...
- tfs 删除工作区
公司员工离职后,有部分文件迁出,有没有tfs密码的情况下,考虑删除工作区,在网上找到方法实践有效,在次记录下. 在命令提示行下进入 “...\Microsoft Visual Studio 8\Com ...
- workflow GetListIdByName 获取表名
1.Assign 获取表的地址 和表名 2.HttpsendWithSuspend==HttpSend 3.ParseDynamicValue 4.GetDynamicValuePropertie ...
- nopcommerce之一(结构分析)
公司的项目,基于nopcommerce开发.接触项目至今已经快一个月了,对nopcommerce这个开源框架整个结构比较熟悉了.这个框架主要要知道三个文件夹,分别是Libraries.Plugins和 ...
- Xamarin For Android 遇到错误java.exe exited with code 1. (msb6006)
今天用Xamarin编译一个android工程遇到这样一个问题:java.exe exited with code 1. (msb6006),项目代码没有问题.于是各种谷歌 ,在http://foru ...
- css+js定位到屏幕中间
ex:让一个div始终显示在屏幕中间 一. css:#idName{position: absolute;z-index: 999;width: ?px;margin-top: ?px;}//此处的初 ...