javax中其实有自带的XML的解析的类,所以,如果需要简单地读取XML中的数据的话,可以不需要使用其他额外的包来完成:
>##获取一个Document
一个简单的类,封装了基本的获取一个XML的Document实例的方法。
后面写的函数,都会调用这里哦,主要是方便。
```
import org.w3c.dom.Document;
import org.xml.sax.InputSource;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.StringReader;
public class XMLBase {
/*
*流数据作为输入,构建Document
*/
public static Document getDoc(InputSource is){
try {
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document document = builder.parse(is);
return document;
}catch (Exception e){
e.printStackTrace();
}
return null;
}
/*
*文件作为输入,构建Document
*/
public static Document getDoc(File is){
try {
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document document = builder.parse(is);
return document;
}catch (Exception e){
e.printStackTrace();
}
return null;
}
/*
*字符串内容,构建Document
*/
public static Document getDoc(String xmlStr){
StringReader sr = new StringReader(xmlStr);
InputSource is = new InputSource(sr);
try {
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document document = builder.parse(is);
return document;
}catch (Exception e){
e.printStackTrace();
}
return null;
}
/*
*将一个Document作为输入,返回XML的原文字符串
*/
public static String xmlStr(Document doc){
try {
TransformerFactory tf = TransformerFactory.newInstance();
Transformer t = tf.newTransformer();
ByteArrayOutputStream bos = new ByteArrayOutputStream();
//将dom树转到流数据中
t.transform(new DOMSource(doc), new StreamResult(bos));
String xmlStr = bos.toString();
return xmlStr;
}catch (Exception e){
e.printStackTrace();
}
return null;
}
/*
*将一个Document作为输入,返回XML的原文字符串,设置原文字符串的编码类型
*/
public static String xmlStr(Document doc,String charset){
try {
TransformerFactory tf = TransformerFactory.newInstance();
Transformer t = tf.newTransformer();
//设置编码类型,一般用于解决中文字符乱码问题
t.setOutputProperty("encoding",charset);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
//将dom树转到流数据中
t.transform(new DOMSource(doc), new StreamResult(bos));
String xmlStr = bos.toString();
return xmlStr;
}catch (Exception e){
e.printStackTrace();
}
return null;
}
}
```
有了Document,第二步骤,获取内容
>##获取内容
一个简单的Demo:
```
import org.w3c.dom.Document;
public class DocDemo {
static String str = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<学生名册>\n" +
" <学生 学号=\"0001214\">\n" +
" <姓名>张燕</姓名>\n" +
" <性别>女</性别>\n" +
" <年龄>22</年龄>\n" +
" </学生>\n" +
" \n" +
" <学生 学号=\"0001239\">\n" +
" <姓名>李继成</姓名>\n" +
" <性别>男</性别>\n" +
" <年龄>22</年龄>\n" +
" </学生>\n" +
" \n" +
" <学生 学号=\"0001275\">\n" +
" <姓名>华伟</姓名>\n" +
" <性别>男</性别>\n" +
" <年龄>22</年龄>\n" +
" </学生>\n" +
" \n" +
"</学生名册>";
public static void main(String[] args){
demo();
}
public static void demo(){
Document doc = XMLBase.getDoc(str);
String str;
str = doc.getElementsByTagName("姓名").item(0).getTextContent(); System.out.println(str);
str = doc.getElementsByTagName("性别").item(0).getTextContent(); System.out.println(str);
str = doc.getElementsByTagName("年龄").item(0).getTextContent(); System.out.println(str);
}
```
在这个demo中,我们可以看,我们很简单就读取到第一个便签为"姓名","性别","年龄"的内容。
更进一步
>##获取去更复杂的节点的内容
对于更复杂的操作,需要一层层定位的,
有两种方法:
{
1.org.w3c.dom.{Node,Element,...}这里面的内容进行使用,来进行解析
2.javax.xml.xpath.XPath;这里面的内容来进行解析也是JDK自带的
}
对于第一种,不好用,所以不推荐,所以不讨论了,来看看第二种:
通过其JDK自带的Xpath
```
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import java.io.IOException;
public class XpathTest {
//需要解析的String
static String bookstore = "<bookstore>\n" +
" <book category=\"COOKING\">\n" +
" <title lang=\"en\">Everyday Italian</title>\n" +
" <author>Giada De Laurentiis</author>\n" +
" <year>2005</year>\n" +
" <price>30.00</price>\n" +
" </book>\n" +
"\n" +
" <book category=\"CHILDREN\">\n" +
" <title lang=\"en\">Harry Potter</title>\n" +
" <author>J K. Rowling</author>\n" +
" <year>2005</year>\n" +
" <price>29.99</price>\n" +
" </book>\n" +
"\n" +
" <book category=\"WEB\">\n" +
" <title lang=\"en\">Learning XML</title>\n" +
" <author>Erik T. Ray</author>\n" +
" <year>2003</year>\n" +
" <price>39.95</price>\n" +
" </book>\n" +
" <book1 category=\"WEB\">\n" +
" <title lang=\"en\">Learning XML</title>\n" +
" <author>Erik T. Ray</author>\n" +
" <year>2003</year>\n" +
" <price>39.95</price>\n" +
" </book1>\n" +
" <url type =\"资料\">http://blog.csdn.net/dongfengkuayue/article/details/50240157</url>\n" +
"</bookstore>";
//使用xpath对xml进行解析
public static void main(String[] args) throws ParserConfigurationException,
SAXException, IOException, XPathExpressionException {
// 解析文件,生成document对象
Document document = XMLBase.getDoc(bookstore);
// 生成XPath对象
XPath xpath = XPathFactory.newInstance().newXPath();
// 获取节点值
String webTitle = (String) xpath.evaluate(
"/bookstore/book[@category='WEB']/title/text()", document,
XPathConstants.STRING);
System.out.println(webTitle);
System.out.println("===========================================================");
// 获取节点属性值
String webTitleLang = (String) xpath.evaluate(
"/bookstore/book[@category='WEB']/title/@lang", document,
XPathConstants.STRING);
System.out.println(webTitleLang);
System.out.println("===========================================================");
// 获取节点对象
Node bookWeb = (Node) xpath.evaluate(
"/bookstore/book[@category='WEB']", document,
XPathConstants.NODE);
System.out.println(bookWeb.getNodeName());
System.out.println("===========================================================");
// 获取节点集合
NodeList books = (NodeList) xpath.evaluate("/bookstore/book", document,
XPathConstants.NODESET);
for (int i = 0; i < books.getLength(); i++) {
Node book = books.item(i);
System.out.println(xpath.evaluate("@category", book,
XPathConstants.STRING));
}
System.out.println("===========================================================");
//此处为是先找到一个节点,在该节点的基础上,继续下一层继续寻找,作为提高效率的一个思路
Node web_book = (Node)xpath.evaluate(
"/bookstore/book[@category='WEB']", document,
XPathConstants.NODE);
String a =(String)xpath.evaluate(
"title/text()", web_book,//#注意这里是web_book
XPathConstants.STRING);
System.out.println(a);
}
}
```
- 参考资料
- 容器的实现
- ArrayList、LinkedList与Vector的区别
- Map,Set,List,Queue,Stack的特点与用法
- HashMap的实现
- HashMap和ConcurrentHashMap差别
- HashMap和HashTable的区别
- fast fail
- java 实用方法
- Collections中实用的函数
- ArrayList中实用的函数
- Integer和Character
- Properties类的简单使用
- XML实用解析
- 从jar包中读取文件信息
- java自带base64加密解密
- java机制
- 分派
- 反射
- 类加载机制
- java中一个对象的初始化
- 泛型
- 自动装箱,拆箱与遍历循环
- 偏向于语法
- new int[]
- new boolean[]
- Switch能否用string做参数
- equals与==的区别
- 泛型对象数组
- Enum的用法
- String、StringBuffer与StringBuilder的区别
- try catch finally
- finalize方法
- object有哪些公用方法
- Java的四种引用,强弱软虚,用到的场景
- java访问修饰符
- Hashcode的作用
- 九种基本数据类型
- java对象大小
- 数组长度
- 动态代理的一个例子
- java.lang.NoClassDefFoundError
- ThreadLocal