您的位置:首页 > 其它

xml字符串转字符串树

2015-09-14 21:31 316 查看
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.util.Stack;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

/**
*将xml字符串转成树结构,此类所在包下应该放置一个名为string的文件,文件内容为xml格式字符串<br>
*
*
字符串<br>
<operation_in><service_name></service_name><verify_code/><request_type/><sysfunc_id>10010082</sysfunc_id><trans_code/><operator_id/><organ_id>1000</organ_id><request_time/><request_seq/><request_source>100001</request_source><request_target>200001</request_target><msg_version>0100</msg_version><cont_version>0100</cont_version><content><field><name>ActionCode</name><id>0</id><simple>QUERYOFFER</simple></field><field><name>Mobile</name><id>0</id><simple>15210939334</simple></field><field><name>Source</name><id>0</id><simple>WEB3</simple></field><field><name>UserTime</name><id>0</id><simple>09/06/2015 16:58:24</simple></field><field><name>FIELD1</name><id>0</id><simple>111002000047</simple></field></content></operation_in>
的转换结果为<br>
operation_in
|
|-------service_name······························<br>
|
|-------verify_code·······························<br>
|
|-------request_type······························<br>
|
|-------sysfunc_id································10010082<br>
|
|-------trans_code································<br>
|
|-------operator_id·······························<br>
|
|-------organ_id··································1000<br>
|
|-------request_time······························<br>
|
|-------request_seq·······························<br>
|
|-------request_source····························100001<br>
|
|-------request_target····························200001<br>
|
|-------msg_version·······························0100<br>
|
|-------cont_version······························0100<br>
|
|-------content<br>
|       |
|       |-------field<br>
|       |       |
|       |       |-------name······················ActionCode<br>
|       |       |
|       |       |-------id························0<br>
|       |       |
|       |       |-------simple····················QUERYOFFER<br>
|       |
|       |-------field<br>
|       |       |
|       |       |-------name······················Mobile<br>
|       |       |
|       |       |-------id························0<br>
|       |       |
|       |       |-------simple····················15210939334<br>
|       |
|       |-------field<br>
|       |       |
|       |       |-------name······················Source<br>
|       |       |
|       |       |-------id························0<br>
|       |       |
|       |       |-------simple····················WEB3<br>
|       |
|       |-------field<br>
|       |       |
|       |       |-------name······················UserTime<br>
|       |       |
|       |       |-------id························0<br>
|       |       |
|       |       |-------simple····················09/06/2015 16:58:24<br>
|       |
|       |-------field<br>
|       |       |
|       |       |-------name······················FIELD1<br>
|       |       |
|       |       |-------id························0<br>
|       |       |
|       |       |-------simple····················111002000047<br>

*/
public class Main {

final static String depthStr="|       ";
final static String nodeStr="|-------";
final static String line="\n";
final static char valueSpliter='·';
final static int VALUE_START_POSITION=33;//调节显示节点值的位置

public static void main(String[] args) throws IOException {
//此类所在的包下有一个名叫string的文件,里面存放xml格式的报文
InputStream stream=Main.class.getClassLoader().getResourceAsStream("cn/com/lewis/xml2tree/string");
BufferedReader br=null;
try {
br = new BufferedReader(new InputStreamReader(stream,"GBK"));
StringBuilder builder=new StringBuilder();
String tmp=null;
while((tmp=br.readLine())!=null){
builder.append(tmp);
}
System.out.println(xmlToTree(builder.toString()));
} catch (IOException | ParserConfigurationException | SAXException e1) {
e1.printStackTrace();
}finally{
if(br!=null){
br.close();
}

}
}

/**
* 转换函数,非递归方式的实现
* @param document
* @return
* @throws ParserConfigurationException
* @throws IOException
* @throws SAXException
*/
public static String xmlToTree(String reqStr) throws ParserConfigurationException, SAXException, IOException{
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
StringReader sr = new StringReader(reqStr);
Document document=db.parse(new InputSource(sr));
Element root=document.getDocumentElement();
NodeList iterator=root.getChildNodes();
Stack<StackItem<Integer>> stack=new Stack<StackItem<Integer>>();
int j=0;
StringBuilder builder=new StringBuilder(root.getNodeName()+line);
Integer depth=0;//此处必须是对象,因为泛型要取匹配类型
do{
for(;j<iterator.getLength();j++){
Node childNode = iterator.item(j);
if(childNode.getNodeType() == Node.ELEMENT_NODE){
StringBuilder tmpBuilder=new StringBuilder();
for(int ii=0;ii<depth;++ii){
builder.append(depthStr);
tmpBuilder.append(depthStr);
}
builder.append(depthStr).append(line).append(tmpBuilder).append(nodeStr).append(childNode.getNodeName());
if(childNode.getChildNodes().getLength()==0||
(childNode.getChildNodes().getLength()==1&&childNode.getChildNodes().item(0).getNodeType() != Node.ELEMENT_NODE) ){
int chc=depthStr.length()*depth+nodeStr.length()+childNode.getNodeName().length();
for(int ii=0;ii<VALUE_START_POSITION-chc;++ii){
builder.append(valueSpliter);
}
builder.append("示例值:").append(childNode.getTextContent());
}else{
stack.push(new StackItem<Integer>(iterator,j+1,depth));
depth=new Integer(depth.intValue()+1);//防止编译时优化成对象自增
j=-1;//j++后值变成0,获取下级节点的首子节点
iterator=childNode.getChildNodes();
}
builder.append(line);
}
}

if(stack.isEmpty()){
break;
}
StackItem<Integer> topItem=stack.pop();
iterator=topItem.iterator;
j=topItem.index;
depth=topItem.cacheObject;
}while(true);
return builder.toString();
}

/**
*
*
* @param <T>
*/
static class StackItem<T> {

/**
* 迭代到的xml节点
*/
public NodeList iterator;

/**
* 迭代到的序号
*/
public int index;

/**
* 附加的数据
*/
public T cacheObject;

public StackItem(NodeList iterator, int index, T cacheObject) {
super();
this.iterator = iterator;
this.index = index;
this.cacheObject = cacheObject;
}

public StackItem() {
super();
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  xml