dom4j - 使用详解与xml-json转换

关于dom4j简介就不再赘述了,通过dom4j可以很轻松从xml中获取内容或者将string转换为xml并输出为xml文档。

同样,你也可以根据需求将xml转换为客户端/前端需要的json形式。

maven依赖如下:

<!-- https://mvnrepository.com/artifact/org.dom4j/dom4j -->
    <dependency>
        <groupId>org.dom4j</groupId>
        <artifactId>dom4j</artifactId>
        <version>2.1.1</version>
    </dependency>

【1】获取Document的几种方式

获取SAXReader 实例。

SAXReader reader = new SAXReader();         

① 读取XML文件,获得document对象

Document  document = reader.read(new File("foo.xml"));  

根据saxReader的read重写方法可知,既可以通过file对象来读取,也可以通过inputStream输入流来读取。

Document document = saxReader.read(inputStream); 

② 解析XML形式的文本,得到document对象.

String text = "<csdn>J080624</csdn>";              
Document document = DocumentHelper.parseText(text);  

// 如果出现异常,尝试使用如下方式
document = reader.read(new ByteArrayInputStream(text.getBytes("UTF-8")));

③ 主动创建document对象.

Document document = DocumentHelper.createDocument(); 

//创建根节点  
Element root = document.addElement("csdn");  

【2】节点对象的操作-Element

① 获取文档的根节点.

Element root = document.getRootElement();  

② 获取某个节点的所有子节点

List elements = root.elements();

③ 取得某个节点的指定子节点.

Element element=node.element("四大名著");  

④ 取得节点的文字

 String text=node.getText();  

⑤ 取得某节点下所有名为“csdn”的子节点,并进行遍历.

List nodes = rootElm.elements("csdn");   

for (Iterator it = nodes.iterator(); it.hasNext();) {     
    Element element = (Element) it.next();    
    // do something  
}  

⑥ 对某节点下的所有子节点进行遍历.

 for(Iterator it=root.elementIterator();it.hasNext();){        
        Element element = (Element) it.next();        
       // do something   
 }  

⑦ 在某节点下添加子节点

 Element element = node.addElement("朝代");  

⑧ 设置节点文字.

element.setText("明朝");  

⑨ 删除某节点.

//childElement是待删除的节点,parentElement是其父节点  

parentElement.remove(childElment);  

⑩ 添加一个CDATA节点

Element contentElm = element.addElement("content");

contentElm.addCDATA("cdata区域");  

【3】节点对象的属性方法操作-Attribute

① 取得某节点下的某属性

Element root=document.getRootElement();        
//属性名
Attribute attribute=root.attribute("id");  

② 取得属性的文字

String text=attribute.getText();  

③ 删除某属性

 Attribute attribute=root.attribute("size");
 
 root.remove(attribute);  

④ 遍历某节点的所有属性

 Element root=document.getRootElement(); 
        
 for(Iterator it=root.attributeIterator();it.hasNext();){          
       Attribute attribute = (Attribute) it.next();           
       String text=attribute.getText();          
       System.out.println(text);    
  }

 List attributes = root.attributes();
 for(Attribute att:attributes ){
	   String text=attribute.getText();          
	   System.out.println(text);  
 }  

⑤ 设置某节点的属性和文字.

 node.addAttribute("name", "sitinspring");  

⑥ 设置属性的文字

  Attribute attribute=root.attribute("name");  
  attribute.setText("csdn");  

【4】将Document写入xml

① 文档中全为英文,不需设置编码

  XMLWriter writer = new XMLWriter(new  FileWriter("ot.xml"));   
  writer.write(document);    
  writer.flush();
  writer.close();  

② 文档中含有中文,设置编码格式

 OutputFormat format = OutputFormat.createPrettyPrint();
 // 创建文件输出的时候,自动缩进的格式                    
 format.setEncoding("UTF-8");//设置编码  
 XMLWriter writer = new XMLWriter(newFileWriter("output.xml"),format);  
 writer.write(document);  
 writer.flush();
 writer.close(); 

【5】String与XML转换

① 字符串转为xml

String xmlStr = "<xml><ERR>用户和密码校验错(密码不符)</ERR><E2><e1>e111</e1></E2></xml>";
//创建SAXReader对象  
SAXReader reader = new SAXReader();  
Document document = null;
ry {
	document = reader.read(new ByteArrayInputStream(xmlStr.getBytes("UTF-8")));
}catch (Exception e) {
	e.printStackTrace();
}

② xml转为字符串

 SAXReader reader = new SAXReader();  
 Document   document = reader.read(new File("csdn.xml"));              
 Element root=document.getRootElement();      
 String docXmlText=document.asXML();  
 String rootXmlText=root.asXML();  
 Element memberElm=root.element("csdn");  
 String memberXmlText=memberElm.asXML();  

【6】将指定xml-Str转为json

xmlStr如下:

String xmlStr = "<ERR>用户和密码校验错(密码不符)</ERR><E2><e1>e111</e1></E2>";

转为json方法如下:

  • 获取的json为一级json
public class XmlUtil {
	private static final Logger log = LoggerFactory.getLogger(XmlUtil.class);
	
	public static String transferXMLToJSON(String xmlStr){
		xmlStr = "<xmlRoot>"+xmlStr+"</xmlRoot>";
		 //创建SAXReader对象  
        SAXReader reader = new SAXReader();  
        //读取文件 转换成Document  
        Document document = null;
		try {
			document = reader.read(new ByteArrayInputStream(xmlStr.getBytes("UTF-8")));
		}catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
        //获取根节点元素对象  
        Element node = document.getRootElement();  
        JSONObject jsonObject = new JSONObject();
        listNodes(node,jsonObject);
        log.debug("the xml-json : "+jsonObject.toJSONString());
        return jsonObject.toJSONString();
	}
        
	//遍历当前节点下的所有节点  
	public static void listNodes(Element node,JSONObject jsonObject){  
	    log.debug("当前节点的名称:" + node.getName());  
	    //首先获取当前节点的所有属性节点  
	    List<Attribute> list = node.attributes();  
	    //遍历属性节点  
	    for(Attribute attribute : list){  
	        log.debug("属性 "+attribute.getName() +":" + attribute.getValue());  
	    }  
	    //如果当前节点内容不为空,则输出  
//	    if(!(node.getTextTrim().equals(""))){  
//	         log.debug("子节点 "+node.getName() + ":" + node.getText());    
//	         jsonObject.put(node.getName(),node.getText());
//	    }  
	    // 如果当前节点名字不为 "xmlRoot",则放入jsonObject
	    if(!(node.getName().equals("xmlRoot"))){  
	    	log.debug("子节点 "+node.getName() + ":" + node.getText());    
	    	jsonObject.put(node.getName(),node.getText());
	    }  
	    //同时迭代当前节点下面的所有子节点  
	    //使用递归  
	    Iterator<Element> iterator = node.elementIterator();  
	    while(iterator.hasNext()){  
	        Element e = iterator.next();  
	        listNodes(e,jsonObject);  
	    }  
	}  
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

流烟默

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值