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 ...
随机推荐
- linux crontab
概念: Linux 工作排程的种类:at, cron at 是个可以处理仅执行一次就结束排程的指令,不过要执行 at 时, 必须要有 atd 这个服务支持. crontab 这个指令所设定的工作将会循 ...
- Singleton in C++11 style
#include <iostream> #include <memory> #include <mutex> class SingletonOld { static ...
- Activity之间传递参数(三)
------siwuxie095 传递值对象,即自定义的有数据类型的对象 1.首先 new 一个 class:User,用于创建自定义对象,同时右键 Generate 出 Constructor.se ...
- 拼图 canvas分割 dom拖拽 pc 移动端
参考:Canvas drag 实现拖拽拼图小游戏 参考的案例,不支持手机端.总结下实现过程中遇到的小坑. gitHub:https://github.com/WppFrontEnd/puzzle 大概 ...
- 编写serversocket简单示例1
package j2se.core.net.tcp; import java.io.DataOutputStream;import java.io.IOException;import java.ne ...
- fiddler的前端资源代理功能。
说一个很有用的东西.fiddler的autoResponder功能能把线上网站的资源引用代理到本地.比如这个js.我们改了想测测效果.但是如果经过中间的流程要把这个文件发布到线上去挺麻烦的,而且 ...
- 中国能用的NTP服务器地址
133.100.11.8 prefer210.72.145.44203.117.180.36131.107.1.10time.asia.apple.com64.236.96.53130.149.17. ...
- 影响google PageRank的因素
1 与pr高的网站做链接: 2 内容质量高的网站链接 3 加入搜索引擎分类目录 4 加入免费开源目录 5 你的链接出现在流量大.知名度高.频繁更新的重要网站上 6 google对PDF格式的文件比较看 ...
- 【温故Delphi】双击工程文件打开软件
问题描述 大部分软件都有鼠标双击文件,就能打开所关联的软件并打开所选工程,这是如何做到的呢? 把文件关联到一个程序中,双击文件来启动程序,那么这个文件名称就是这个程序的命令行的一个参数. 所以要想实现 ...
- Codeforces Round #379 (Div. 2) Analyses By Team:Red & Black
A.Anton and Danik Problems: 给你长度为N的,只含'A','D'的序列,统计并输出何者出现的较多,相同为"Friendship" Analysis: lu ...