这里先选取用Dom4j的方式学习
1,Dom4j简介
Dom4j是dom4j.org出品的一个开源XML解析包。其应用与Java平台,采用了Java集合框架并完全支持DOM,SAX和JAXP。
Dom4j是一个非常优秀的Java XML API,性能优异,简单易用。
DOM:把整个文档作为一个对象。
Dom4j最大的特色是使用大量的接口。它的主要接口都在org.dom4j里面定义:
接口之间的继承关系如下:
interface java.lang.Cloneable
interface org.dom4j.Node
interface org.dom4j.Attribute
interface org.dom4j.Branch
interface org.dom4j.Document
interface org.dom4j.Element
interface org.dom4j.CharacterData
interface org.dom4j.CDATA
interface org.dom4j.Comment
interface org.dom4j.Text
interface org.dom4j.DocumentType
interface org.dom4j.Entity
interface org.dom4j.ProcessingInstruction
2,XML文档操作
2.1、读取XML文档:
读写XML文档主要依赖于org.dom4j包,有DOMReader和SAXReader两种方式。因为利用了相同的接口,所以它们的调用方式是一样的。
实例代码:
public static Document load(String fileName){
Document document = null;
try{
SAXReader saxReader = new SAXReader();
document = saxReader.read(new File(fileName));//读取XML文件,取得document对象
}catch( Exception e){
e.printStackTrace();
}
return document;
}
或者:
public static Document load(String fileName){
Document document =null;
try{
SAXReader saxReader = new SAXReader();
document = saxReader.read(url);//读取XML文件,获得document对象
}catch(Exception e){
e.printStackTrace();
}
return document;
}
//读取指定的XML文件之后返回一个Document对象,这个对象代表了整个XML文档,
用于各种DOM运算。按照XML文件头所定义的编码来转换。
2.2获取根节点
根节点是xml分析的开始,任何xml分析工作都需要从跟开始:
Xml xml = new Xml();
Document dom = xml.load(path+"/"+file);
Element root = dom.getRootElement();
2.3新增一个节点以及其下的子节点与数据
Element menuElement = root.addElement("menu");
Element engNameElement = menuElement.addElement("engName");
engNameElement.setText(catNameEn);
2.4写入XML文件
注意文件操作的包装类是乱码的根源
public static boolean doc2XmlFile(Document document,String fileName){
boolean flag = true;
try{
XMLWriter writer = new XMLWriter(new OutputStreamWriter(new FileOutputStream(fileName),"UTF-8"));
writer.write(document);
writer.close();
}catch(Exception e){
flag = false;
e.printStackTrace();
}
System.out.println(flag);
return flag;
}
Dom4j通过XMLWriter将Document对象表示的XML树写入指定的文件,并使用OutputFormat格式对象指定写入的风格和编码格式。
调用OutputFormat.createPrettyPrint()方法可以获得一个默认的pretty print风格的格式对象。对OutputFormat对象调用setEncoding()方法可以指定XML文件的编码方式。
public void writeTo(OutputStream out,String encoding) throws UnsupportedEncodingException,IOException{
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("gb2312");
XMLWriter writer = new XMLWriter(System.out.format);
writer.write(doc);
writer.flush();
return;
}
2. 5、遍历xml节点
对 Document对象调用getRootElement()方法可以返回代表根节点的Element对象。拥有了一个Element对象后,可以对该对象 调用elementIterator()方法获得它的子节点的Element对象们的一个迭代器。使用(Element)iterator.next() 方法遍历一个iterator并把每个取出的元素转化为Element类型。
public booleanisOnly(String catNameEn,HttpServletRequest request,String xml) {
boolean flag =true;
String path =request.getRealPath("");
Document doc =load(path+"/"+xml);
Element root =doc.getRootElement();
for (Iterator i =root.elementIterator(); i.hasNext();) {
Element el =(Element) i.next();
if(catNameEn.equals(el.elementTextTrim("engName"))){
flag = false;
break;
}
}
return flag;
}
2.6、创建xml文件
public static void main(String args[]){
String fileName="c:/text.xml";
Document document=DocumentHelper.createDocument();//建立document对象,用来操作xml文件
Element booksElement=document.addElement("books");//建立根节点
booksElement.addComment("Thisis a test for dom4j ");//加入一行注释
Element bookElement=booksElement.addElement("book");//添加一个book节点
bookElement.addAttribute("show","yes");//添加属性内容
Element titleElement=bookElement.addElement("title");//添加文本节点
titleElement.setText("ajax inaction");//添加文本内容
try{
XMLWriter writer=newXMLWriter(new FileWriter(new File(fileName)));
writer.write(document);
writer.close();
}catch(Exception e){
e.printStackTrace();
}
}
2.7、修改节点属性
public static void modifyXMLFile(){
String oldStr = "c:/text.xml";
String newStr = "c:/text1.xml";
Document document = null;
//修改节点的属性
try {
SAXReader saxReader = newSAXReader(); // 用来读取xml文档
document = saxReader.read(newFile(oldStr)); // 读取xml文档
List list =document.selectNodes("/books/book/@show");// 用xpath查找节点book的属性
Iterator iter = list.iterator();
while (iter.hasNext()) {
Attribute attribute = (Attribute)iter.next();
if(attribute.getValue().equals("yes"))
attribute.setValue("no");
}
} catch (Exception e) {
e.printStackTrace();
}
//修改节点的内容
try {
SAXReader saxReader = newSAXReader(); // 用来读取xml文档
document = saxReader.read(newFile(oldStr)); // 读取xml文档
List list =document.selectNodes("/books/book/title");// 用xpath查找节点book的内容
Iterator iter = list.iterator();
while (iter.hasNext()) {
Element element = (Element) iter.next();
element.setText("xxx");// 设置相应的内容
}
} catch (Exception e) {
e.printStackTrace();
}
try {
XMLWriter writer = new XMLWriter(newFileWriter(new File(newStr)));
writer.write(document);
writer.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
2.8、删除节点
public static void removeNode() {
String oldStr = "c:/text.xml";
String newStr = "c:/text1.xml";
Document document = null;
try {
SAXReader saxReader = newSAXReader();// 用来读取xml文档
document = saxReader.read(newFile(oldStr));// 读取xml文档
List list = document.selectNodes("/books/book");//用xpath查找对象
Iterator iter = list.iterator();
while (iter.hasNext()) {
Element bookElement = (Element)iter.next();
// 创建迭代器,用来查找要删除的节点,迭代器相当于指针,指向book下所有的title节点
Iterator iterator =bookElement.elementIterator("title");
while (iterator.hasNext()) {
Element titleElement = (Element)iterator.next();
if (titleElement.getText().equals("ajax in action")) {
bookElement.remove(titleElement);
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
try {
XMLWriter writer = new XMLWriter(newFileWriter(new File(newStr)));
writer.write(document);
writer.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
2、XML文档操作2
2.1、Document对象相关
1、读取XML文件,获得document对象.
SAXReader reader = new SAXReader();
Document document = reader.read(newFile("input.xml"));
2、解析XML形式的文本,得到document对象.
String text ="<members></members>";
Documentdocument = DocumentHelper.parseText(text);
3、主动创建document对象.
Document document = DocumentHelper.createDocument();
Elementroot = document.addElement("members");// 创建根节点
2.2、节点相关
1、获取文档的根节点.
Element rootElm =document.getRootElement();
2、取得某节点的单个子节点.
ElementmemberElm=root.element("member");// "member"是节点名
3.取得节点的文字
Stringtext=memberElm.getText();
String text=root.elementText("name");这个是取得根节点下的name字节点的文字.
4.取得某节点下指定名称的所有节点并进行遍历.
List nodes =rootElm.elements("member");
for (Iterator it =nodes.iterator(); it.hasNext();) {
Elementelm = (Element) it.next();
//do something
}
5.对某节点下的所有子节点进行遍历.
for(Iteratorit=root.elementIterator();it.hasNext();){
Elementelement = (Element) it.next();
//do something
}
6.在某节点下添加子节点.
Element ageElm =newMemberElm.addElement("age");
7.设置节点文字.
ageElm.setText("29");
8.删除某节点.
parentElm.remove(childElm); // childElm是待删除的节点,parentElm是其父节点
9.添加一个CDATA节点.
Element contentElm = infoElm.addElement("content");
contentElm.addCDATA(diary.getContent());
2.3、属性相关.
1.取得节点的指定的属性
Element root=document.getRootElement();
Attributeattribute=root.attribute("size"); // 属性名name
2.取得属性的文字
String text=attribute.getText();
Stringtext2=root.element("name").attributeValue("firstname");
//这个是取得根节点下name字节点的firstname属性的值.
3.遍历某节点的所有属性
Elementroot=document.getRootElement();
for(Iteratorit=root.attributeIterator();it.hasNext();){
Attributeattribute = (Attribute) it.next();
Stringtext=attribute.getText();
System.out.println(text);
}
4.设置某节点的属性和文字.
newMemberElm.addAttribute("name","sitinspring");
5.设置属性的文字
Attribute attribute=root.attribute("name");
attribute.setText("sitinspring");
6.删除某属性
Attribute attribute=root.attribute("size");// 属性名name
root.remove(attribute);
2.4、将文档写入XML文件.
1.文档中全为英文,不设置编码,直接写入.
XMLWriter writer =new XMLWriter(newFileWriter("output.xml"));
writer.write(document);
writer.close();
2.文档中含有中文,设置编码格式再写入.
OutputFormatformat = OutputFormat.createPrettyPrint();
format.setEncoding("GBK"); // 指定XML编码
XMLWriter writer =new XMLWriter(new FileWriter("output.xml"),format);
writer.write(document);
writer.close();
2.5、字符串与XML的转换
1.将字符串转化为XML
String text ="<members> <member>sitinspring</member></members>";
Document document= DocumentHelper.parseText(text);
2.将文档或节点的XML转化为字符串.
SAXReader reader =new SAXReader();
Document document= reader.read(new File("input.xml"));
Elementroot=document.getRootElement();
StringdocXmlText=document.asXML();
StringrootXmlText=root.asXML();
ElementmemberElm=root.element("member");
StringmemberXmlText=memberElm.asXML();
3、dom4j的事件处理模型涉及的类和接口:
3.1、类:SAXReader
public void addHandler(String path,ElementHandler handler)
当解析到path指定的路径时,将调用参数handler指定的处理器。针对不同的节点可以添加多个handler实例。或者调用默认的HandlersetDefaultHandler(ElementHandler handler);
3.2、接口ElementHandler
public void onStart(ElementPath path)
该方法在解析到元素的开始标签时被调用。
public void onEnd(ElementPath path)
该方法在解析到元素的结束标签时被调用
3.3、接口:ElementPath (假设有参数:ElementPath path)
public void addHandler(String path,ElementHandler)
该方法与SAXReader类中的addHandler()方法的作用相同。路径path可以是绝对路径(路径以/开头),也可以是相对路径(假设是当前路径的子节点路径)。
public void removeHandler(String path)
移除指定路径上的ElementHandler实例。路径可以是相对路径,也可以是绝对路径。
public String getPath()
该方法得到当前节点的路径。该方法返回的是完整的绝对路径
public Element getCurrent()
该方法得到当前节点。
3.3、Element类
3.4、类DocumentHelper
DocumentHelper 是用来生成生成 XML 文档的工厂类
4、通过xpath查找指定的节点
采用xpath查找需要引入jaxen-xx-xx.jar,否则会报java.lang.NoClassDefFoundError:org/jaxen/JaxenException异常。
Listlist=document.selectNodes("/books/book/@show");
转载于:https://www.cnblogs.com/LeonLife/p/4194895.html
相关资源:Java解析XML的jar包 四种解析方法