首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > XML SOAP >

xml排序有关问题

2013-01-04 
xml排序问题求助 原始xml:titleCS从入门到精通/titleauthor候捷/authorprice58.3/pricetitle

xml排序问题求助

 原始xml:
     <title>CS从入门到精通</title> 
     <author>候捷</author> 
     <price>58.3</price> 

     <title>CS从入门到精通1</title> 
     <author>候捷1</author> 
     <price>58.31</price> 
 
  要实现排序后的效果:
       <title>CS从入门到精通</title> 
       <title>CS从入门到精通1</title>
  
       <author>候捷</author> 
       <author>候捷1</author> 
  
      <price>58.3</price> 
      <price>58.31</price> 
  请大家帮忙看看如何实现这样排序的代码。
[解决办法]
下面是我写的排序过程,由于时间仓促,只瞄准需求去写,没有进行优化,lz可以自己优化下,关于xml的学习,可以参看我的博客,如有不足之处还望指教。以下代码,lz直接复制粘贴到类里面运行即可
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

public class DocumentText01 {

public static Document newdoc = DocumentHelper.createDocument();
public static Element newroot = DocumentHelper.createElement("newroot");
public static void main(String[] args) {
String xmlpath = "C:/one.xml";
String newxmlpath = "C:/two.xml";
readexml(xmlpath,"1",newxmlpath);//第一次获取所有底层标签,建立新xml的document
readexml(xmlpath,"2",newxmlpath);//第二次给新的document下面添加排序节点
createDoucument_02(newxmlpath);//将新的document对象写入到新的xml文件中
}

//解析原始的xml
public static void readexml(String xmlpath,String jiexi,String newxmlpath){
SAXReader readxml = new SAXReader();
Document doc = null;
Element root = null;

try {
doc = readxml.read(new File(xmlpath));//解析原始的xml
root = doc.getRootElement();//获取原始xml的根节点
readElement(root,newxmlpath,jiexi);
} catch (DocumentException e) {
e.printStackTrace();
}
}

/**
 * 递归查询原始xml的内容
 * @param root 原始xml的子节点
 * @param newxmlpath 新xml的路径
 * @param jiexi 是否为第一次解析
 * @return
 */
public static boolean readElement(Element root,String newxmlpath,String jiexi){
List<Element> childlist = root.elements();
if(childlist!=null&&childlist.size()>0){//如果不是最底层节点
for(int i =0;i<childlist.size();i++){
Element child = childlist.get(i);
boolean f = readElement(child,newxmlpath,jiexi);
if(f) return true;
}
}else if(jiexi.endsWith("1")){//第一次递归,如果是最底层节点,如 :<title>CS从入门到精通</title> ,进行读取内容
List<Element> list = root.getParent().elements();//获取它的父类下的所有子类
for(int i =0;i<list.size();i++){
Element newchild = newroot.addElement(list.get(i).getName());


newchild.addAttribute("ID", newchild.getName());
}
return true;
}else{//第二次递归,给新的xml中添加排序内容
List<Element> listelement = newroot.elements();
for(int i =0;i<listelement.size();i++){
//原始xml的最底层节点名称和新xml的最底层节点名称相同,则将原始xml节点内容添加到新的xml对应的节点下
if(root.getName().endsWith(listelement.get(i).getName())){
//给新的xml节点下添加原始xml的节点,原始xml节点的名称是root.getName()
Element newchild = newroot.elementByID(root.getName()).addElement(root.getName());
newchild.setText(root.getText());//原始xml节点的内容是root.getText()
}
}
}
return false;
}

//将新的document对象写入新的xml文件中
public static void createDoucument_02(String newxmlpath){
newdoc.setRootElement(newroot);//快捷键:ctrl+shift+o
OutputFormat format=new OutputFormat("",true);//输出到指定文件,设置其字符编码和输出格式
format.setEncoding("GBK");//设置xml的字符编码格式
try{
XMLWriter xml3=new XMLWriter(new FileOutputStream(newxmlpath),format);
xml3.write(newdoc);
xml3.close();
}catch(IOException se){
se.printStackTrace();
}
}

/**
 *  根据要求模拟出原始的xml文件
 * @param xmlpath 原始的xml文件的文件路径
 */
public static void createDoucument_01(String xmlpath){
//创建xml文档,并设置文档根元素
Document document =DocumentHelper.createDocument();
Element element = DocumentHelper.createElement("root");
//建立树的第一个子节点
Element book = element.addElement("book");
Element title = book.addElement("title");//创建名称为title的子节点
title.addText("CS从入门到精通");//为title的子节点添加内容
Element author = book.addElement("author");
author.addText("候捷");
Element price = book.addElement("price");
price.addText("58.3");
//建立树的第二个子节点
Element book1 = element.addElement("book");
Element title1 = book1.addElement("title");
title1.addText("CS从入门到精通1");
Element author1 = book1.addElement("author");
author1.addText("候捷1");
Element price1 = book1.addElement("price");
price1.addText("58.31");

document.setRootElement(element);//快捷键:ctrl+shift+o
OutputFormat format=new OutputFormat("",true);//输出到指定文件,设置其字符编码和输出格式
format.setEncoding("GBK");//设置xml的字符编码格式
try{
XMLWriter xml3=new XMLWriter(new FileOutputStream(xmlpath),format);
xml3.write(document);
xml3.close();
}catch(IOException se){
se.printStackTrace();
}
}

}

热点排行