遍历xml所有节点 采用dom4j,jdom

项目中做消息签名验证需要将xml各个节点值相加,采用dom4j和jdom分别实现。

 

 

dom4j:

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
String xml="<?xml version=\"1.0\" encoding=\"UTF-8\"><Order><Cid>456</Cid><Pwd>密码</Pwd><Pid>商品单号</Pid><Price>商品价格</Price></Order>";
		
 try {
Document doc = DocumentHelper.parseText(xml);
SAXReader reader = new SAXReader();

Element el=doc.getRootElement();
for(Iterator it=el.elementIterator();it.hasNext();){
 Element element = (Element) it.next();
System.out.println(element.getText());
			}
		} catch (DocumentException e) {
// TODO Auto-generated catch block
			e.printStackTrace();
		}

 

 

 jdom实现如下:

 

 

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.Namespace;
import org.jdom.input.SAXBuilder;

 public List xmlElements(String xmlDoc) {

  //创建一个新的字符串
	        StringReader read = new StringReader(xmlDoc);
	        //创建新的输入源SAX 解析器将使用 InputSource 对象来确定如何读取 XML 输入
	        InputSource source = new InputSource(read);
	        //创建一个新的SAXBuilder
	        SAXBuilder sb = new SAXBuilder();
	        try {
	            //通过输入源构造一个Document
	            Document doc = sb.build(source);
	            //取的根元素
	            Element root = doc.getRootElement();
	     	            //得到根元素所有子元素的集合
	            List jiedian = root.getChildren();
	            //获得XML中的命名空间(XML中未定义可不写)
	            Namespace ns = root.getNamespace();
	            Element et = null;
	            for(int i=0;i<jiedian.size();i++){
	                et = (Element) jiedian.get(i);//循环依次得到子元素
	                System.out.println(et.getValue());
	         	            }
	        	            }
	        } catch (JDOMException e) {
	            // TODO 自动生成 catch 块
	            e.printStackTrace();
	        } catch (IOException e) {
	            // TODO 自动生成 catch 块
	            e.printStackTrace();
	        }
	        return null;
	    }
	    public static void main(String[] args) throws Exception{
	   String xml0="<?xml version=\"1.0\" encoding=\"UTF-8\"?><Order><Cid>456</Cid><Pwd>密码</Pwd><Pid>商品单号</Pid><Prices><Price>商品价格01</Price><Price>商品价格02</Price></Prices></Order>";
	        doc.xmlElements(xml0);
	        
}

 

 

以上只能实现树结构2层的XML,以下递归出多层XML节点值:

 

	public static String getXmlElmentValue(String xml){
		StringBuffer str=new StringBuffer(); 
			try {
				org.dom4j.Document doc= DocumentHelper.parseText(xml);
				org.dom4j.Element el=doc.getRootElement();
				return recGetXmlElementValue(el,str).toString();
			} catch (DocumentException e) {
				e.printStackTrace();
				return null;
			}
		}
		
		private static StringBuffer recGetXmlElementValue(org.dom4j.Element ele,StringBuffer valueBuff){
			List eleList = ele.elements();
			if(eleList.size()==0){
				valueBuff.append(ele.getText().replaceAll("[\n-\r]", ""));
				return valueBuff;
			}else{
				for(Iterator<org.dom4j.Element> iter = eleList.iterator();iter.hasNext();){
					org.dom4j.Element innerEle = iter.next();
					recGetXmlElementValue(innerEle,valueBuff);
				}
				return valueBuff;
			}
		}

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值