jdom和dom4j解析xml注释拿到注释下的节点

来源:互联网 发布:数据库网上书店系统 编辑:程序博客网 时间:2024/06/05 08:14

xml 所有元素都是节点,其中包括元素节点,值得注意的是不是所有节点都是元素节点(Element)所以类型转换的时候要

注意,是我们常用的,还有文档节点,在解析到文档节点 时,解析文件的DTD元素这样就会在解析的时候等一段时间,也可

以跳过不去解析下面找到了一个方法。

import java.io.StringBufferInputStream;import org.xml.sax.EntityResolver;import org.xml.sax.InputSource;/** * 跳过解析文件的DTD元素时用 * @author RAQ * */public class NoOpEntityResolver implements EntityResolver {     public InputSource resolveEntity(String publicId, String systemId){           return new InputSource(new StringBufferInputStream(""));        }}

下面是操作xml类:

package com;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.util.ArrayList;import java.util.List;import org.jdom.Content;import org.jdom.DocType;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;import org.xml.sax.EntityResolver;public class Test {/** * 解析xml得到Document对象 * @param path * @return */public static Document loadXML(String path){File file = new File(path);SAXBuilder sax = new SAXBuilder();sax.setEntityResolver(new NoOpEntityResolver());//不解析文件的DTD元素(文档说明部分)Document doc = null;try {doc = sax.build(file);} catch (JDOMException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return doc;}/** * 解析注释获得注释下面的节点 * @param doc * @return */public static List<Content> getContentList(Document doc){List<Content> integrationList = new ArrayList<Content>();Element root = doc.getRootElement();List<Content> childList = root.getContent();for(int i = 0;i<childList.size();i++){if((i+2)<childList.size()&&"integration".equals(childList.get(i).getValue().trim())){//判断是不是注释integrationList.add(childList.get(i+2));//Element e = (Element)childList.get(i+2);可以强转成Element但是取到的是元素节点才可以强转i = i + 2;}}return integrationList;}/** * 把解析到的节点再存到xml * @param integrationList * @param generatePath */public static void writeXML(List<Content> integrationList,String generatePath){File outFile = new File(generatePath);Document doc = null;Element root = null;DocType dt = new DocType("web-app","-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN","http://java.sun.com/dtd/web-app_2_3.dtd");//这里是web.xml的文档说明if(outFile.exists()){ doc = loadXML(generatePath); root = doc.getRootElement(); if(doc.getDocType()==null) doc.setDocType(dt); for(int i = 0;i<integrationList.size();i++){root.addContent(integrationList.get(i).detach());//要去点原来的父节点 }}else{root = new Element("web-app");for(int i = 0;i<integrationList.size();i++){root.addContent(integrationList.get(i).detach());}doc.setDocType(dt);doc = new Document(root);}XMLOutputter out = new XMLOutputter();out.setFormat(Format.getPrettyFormat().setEncoding("utf-8"));String xmlStr=out.outputString(doc);          System.out.println(xmlStr);        FileOutputStream fos = null;        try {fos = new FileOutputStream(outFile,false);out.output(doc,fos);} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}finally{try {fos.close();} catch (IOException e) {e.printStackTrace();}}}public static void main(String[] args) {//测试String path = "G:\\merge\\test.xml";String generatePath = "G:/testweb.xml";List<Content> integrationList = getContentList(loadXML(path));writeXML(integrationList,generatePath);}}
以上是jdom解析xml注释内容。

下面是dom4j解析注释的部分,不全,

package com;import java.util.ArrayList;import java.util.Iterator;import java.util.List;import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.Element;import org.dom4j.Node;import org.dom4j.io.SAXReader;public class Dom4jTest {/** * @param args */public static void main(String[] args) {List<Element> list = new ArrayList<Element>();//File file = new File();   SAXReader sax = new SAXReader();   try {Document doc = sax.read("G:/merge/test.xml");Element root = doc.getRootElement();for (Iterator<Node> nodeIterator =root.nodeIterator(); nodeIterator.hasNext();) {Node node = nodeIterator.next();if(node.getNodeType()==node.COMMENT_NODE&&"integration".equals(node.getText())){Element nodeNext = (Element)nodeIterator.next();list.add(nodeNext);}}} catch (DocumentException e) {e.printStackTrace();}for(Element ele:list){for (Iterator<Element> eleIterator =ele.elementIterator(); eleIterator.hasNext();) {Element child = eleIterator.next();System.out.println(child.getName()+"\t"+child.getTextTrim());}}}}


应该是类似的,自己总结下下次遇到就不用百度谷歌了。