关于Java解析XML文档的问题

mac2022-06-30  132

这里先选取用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包 四种解析方法
最新回复(0)