`
antti
  • 浏览: 65809 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Java关于XML文档排序的问题

阅读更多
近日,工作中遇到一个有关XML文件内容进行排序的问题。经多方求教,加上本人的一点点努力,终于解决此问题。特此记录,以供其他朋友参详。

1. 问题描述

XML文档结构如下:
<?xml version="1.0" encoding="gb2312"?>
<?xml-stylesheet type="text/xsl" title="master" href="./../../ReportXSL/master_sppg.xsl"?>
<?xml-stylesheet type="text/xsl" title="detail" href="./../../ReportXSL/detail_sppg.xsl"?>
<?xreport processor="withub.common.stat.xreport.AppendSQL" cache="false"?>
<xreport id="80001" statBeginTime="2008-12-23 " statEndTime="2009-09-22 " statTime="2009-09-16">
<result>
	<col>
		<col colspan="1" id="-1" rowspan="1"/>
		<col colspan="1" id="1" name="xx数" rowspan="1"/>
		<col colspan="1" id="2" name="xx数" rowspan="1"/>
		<col colspan="1" format="##.##" id="3" name="同期xx率" operator="(col[1]/col[2])*100" rowspan="1"/>
		<col colspan="1" id="4" name="xx数" rowspan="1"/>
		<col colspan="1" id="5" name="xx数" rowspan="1"/>
		<col colspan="1" id="6" name="上一期末xx数" rowspan="1"/>
		<col colspan="1" format="##.##" id="7" name="xx率" operator="(col[4]/(col[5]+col[6]))*100" rowspan="1"/>
	</col>
	<row id="$001">
		<row code="1300" colspan="1" id="$001" name="" rowspan="1" startExpand="1"/>
		<col format="" id="1" isLink="1" url="ZB_CODE=ZB_1_C1&amp;CBFYBS=1300" value="3234"/>
		<col format="" id="2" isLink="1" url="ZB_CODE=ZB_1_C2&amp;CBFYBS=1300" value="3388"/>
		<col format="##.##" id="3" isLink="0" value="95.45454545"/>
		<col format="" id="4" isLink="1" url="ZB_CODE=ZB_1_1_C1&amp;CBFYBS=1300" value="3234"/>
		<col format="" id="5" isLink="1" url="ZB_CODE=ZB_1_1_C2&amp;CBFYBS=1300" value="3388"/>
		<col format="" id="6" isLink="1" url="ZB_CODE=ZB_1_1_C3&amp;CBFYBS=1300" value="894"/>
		<col format="##.##" id="7" isLink="0" value="75.52545539"/>
	</row>
	<row id="$002">
		<row code="1301" colspan="1" id="$002" name="XX中院" rowspan="1"/>
		<col format="" id="1" isLink="1" url="ZB_CODE=ZB_1_C1&amp;CBFYBS=1301" value="4596"/>
		<col format="" id="2" isLink="1" url="ZB_CODE=ZB_1_C2&amp;CBFYBS=1301" value="5523"/>
		<col format="##.##" id="3" isLink="0" value="83.21564367"/>
		<col format="" id="4" isLink="1" url="ZB_CODE=ZB_1_1_C1&amp;CBFYBS=1301" value="4596"/>
		<col format="" id="5" isLink="1" url="ZB_CODE=ZB_1_1_C2&amp;CBFYBS=1301" value="5523"/>
		<col format="" id="6" isLink="1" url="ZB_CODE=ZB_1_1_C3&amp;CBFYBS=1301" value="1422"/>
		<col format="##.##" id="7" isLink="0" value="66.17710583"/>
	</row>
	<row id="$003">
		<row code="1302" colspan="1" id="$003" name="XX市X处" rowspan="1"/>
		<col format="" id="1" isLink="1" url="ZB_CODE=ZB_1_C1&amp;CBFYBS=1302" value="2907"/>
		<col format="" id="2" isLink="1" url="ZB_CODE=ZB_1_C2&amp;CBFYBS=1302" value="3183"/>
		<col format="##.##" id="3" isLink="0" value="91.32893497"/>
		<col format="" id="4" isLink="1" url="ZB_CODE=ZB_1_1_C1&amp;CBFYBS=1302" value="2907"/>
		<col format="" id="5" isLink="1" url="ZB_CODE=ZB_1_1_C2&amp;CBFYBS=1302" value="3183"/>
		<col format="" id="6" isLink="1" url="ZB_CODE=ZB_1_1_C3&amp;CBFYBS=1302" value="852"/>
		<col format="##.##" id="7" isLink="0" value="72.04460967"/>
	</row>
	<row id="$004">
		<row code="1303" colspan="1" id="$004" name="XX市X处" rowspan="1"/>
		<col format="" id="1" isLink="1" url="ZB_CODE=ZB_1_C1&amp;CBFYBS=1303" value="3587"/>
		<col format="" id="2" isLink="1" url="ZB_CODE=ZB_1_C2&amp;CBFYBS=1303" value="4444"/>
		<col format="##.##" id="3" isLink="0" value="80.71557156"/>
		<col format="" id="4" isLink="1" url="ZB_CODE=ZB_1_1_C1&amp;CBFYBS=1303" value="3587"/>
		<col format="" id="5" isLink="1" url="ZB_CODE=ZB_1_1_C2&amp;CBFYBS=1303" value="4444"/>
		<col format="" id="6" isLink="1" url="ZB_CODE=ZB_1_1_C3&amp;CBFYBS=1303" value="757"/>
		<col format="##.##" id="7" isLink="0" value="68.96750625"/>
	</row>
	<row id="$005">
		<row code="1304" colspan="1" id="$005" name="XX市X处" rowspan="1"/>
		<col format="" id="1" isLink="1" url="ZB_CODE=ZB_1_C1&amp;CBFYBS=1304" value="3828"/>
		<col format="" id="2" isLink="1" url="ZB_CODE=ZB_1_C2&amp;CBFYBS=1304" value="4961"/>
		<col format="##.##" id="3" isLink="0" value="77.16186253"/>
		<col format="" id="4" isLink="1" url="ZB_CODE=ZB_1_1_C1&amp;CBFYBS=1304" value="3828"/>
		<col format="" id="5" isLink="1" url="ZB_CODE=ZB_1_1_C2&amp;CBFYBS=1304" value="4961"/>
		<col format="" id="6" isLink="1" url="ZB_CODE=ZB_1_1_C3&amp;CBFYBS=1304" value="772"/>
		<col format="##.##" id="7" isLink="0" value="66.77132391"/>
	</row>
	<row id="$006">
		<row code="1305" colspan="1" id="$006" name="XX市X处" rowspan="1"/>
		<col format="" id="1" isLink="1" url="ZB_CODE=ZB_1_C1&amp;CBFYBS=1305" value="2718"/>
		<col format="" id="2" isLink="1" url="ZB_CODE=ZB_1_C2&amp;CBFYBS=1305" value="3884"/>
		<col format="##.##" id="3" isLink="0" value="69.97940268"/>
		<col format="" id="4" isLink="1" url="ZB_CODE=ZB_1_1_C1&amp;CBFYBS=1305" value="2718"/>
		<col format="" id="5" isLink="1" url="ZB_CODE=ZB_1_1_C2&amp;CBFYBS=1305" value="3884"/>
		<col format="" id="6" isLink="1" url="ZB_CODE=ZB_1_1_C3&amp;CBFYBS=1305" value="334"/>
		<col format="##.##" id="7" isLink="0" value="64.43812233"/>
	</row>
	<row id="$007">
		<row code="1306" colspan="1" id="$007" name="XX市X处" rowspan="1"/>
		<col format="" id="1" isLink="1" url="ZB_CODE=ZB_1_C1&amp;CBFYBS=1306" value="6471"/>
		<col format="" id="2" isLink="1" url="ZB_CODE=ZB_1_C2&amp;CBFYBS=1306" value="7979"/>
		<col format="##.##" id="3" isLink="0" value="81.10038852"/>
		<col format="" id="4" isLink="1" url="ZB_CODE=ZB_1_1_C1&amp;CBFYBS=1306" value="6471"/>
		<col format="" id="5" isLink="1" url="ZB_CODE=ZB_1_1_C2&amp;CBFYBS=1306" value="7979"/>
		<col format="" id="6" isLink="1" url="ZB_CODE=ZB_1_1_C3&amp;CBFYBS=1306" value="1328"/>
		<col format="##.##" id="7" isLink="0" value="69.52831202"/>
	</row>
	<row id="$008">
		<row code="1307" colspan="1" id="$008" name="XX市X处" rowspan="1"/>
		<col format="" id="1" isLink="1" url="ZB_CODE=ZB_1_C1&amp;CBFYBS=1307" value="1352"/>
		<col format="" id="2" isLink="1" url="ZB_CODE=ZB_1_C2&amp;CBFYBS=1307" value="1773"/>
		<col format="##.##" id="3" isLink="0" value="76.25493514"/>
		<col format="" id="4" isLink="1" url="ZB_CODE=ZB_1_1_C1&amp;CBFYBS=1307" value="1352"/>
		<col format="" id="5" isLink="1" url="ZB_CODE=ZB_1_1_C2&amp;CBFYBS=1307" value="1773"/>
		<col format="" id="6" isLink="1" url="ZB_CODE=ZB_1_1_C3&amp;CBFYBS=1307" value="220"/>
		<col format="##.##" id="7" isLink="0" value="67.83743101"/>
	</row>
	<row id="$009">
		<row code="1308" colspan="1" id="$009" name="XX市X处" rowspan="1"/>
		<col format="" id="1" isLink="1" url="ZB_CODE=ZB_1_C1&amp;CBFYBS=1308" value="12727"/>
		<col format="" id="2" isLink="1" url="ZB_CODE=ZB_1_C2&amp;CBFYBS=1308" value="14326"/>
		<col format="##.##" id="3" isLink="0" value="88.8384755"/>
		<col format="" id="4" isLink="1" url="ZB_CODE=ZB_1_1_C1&amp;CBFYBS=1308" value="12727"/>
		<col format="" id="5" isLink="1" url="ZB_CODE=ZB_1_1_C2&amp;CBFYBS=1308" value="14326"/>
		<col format="" id="6" isLink="1" url="ZB_CODE=ZB_1_1_C3&amp;CBFYBS=1308" value="2021"/>
		<col format="##.##" id="7" isLink="0" value="77.85526396"/>
	</row>
	<row id="$010">
		<row code="1309" colspan="1" id="$010" name="XX市X处" rowspan="1"/>
		<col format="" id="1" isLink="1" url="ZB_CODE=ZB_1_C1&amp;CBFYBS=1309" value="4125"/>
		<col format="" id="2" isLink="1" url="ZB_CODE=ZB_1_C2&amp;CBFYBS=1309" value="4851"/>
		<col format="##.##" id="3" isLink="0" value="85.03401361"/>
		<col format="" id="4" isLink="1" url="ZB_CODE=ZB_1_1_C1&amp;CBFYBS=1309" value="4125"/>
		<col format="" id="5" isLink="1" url="ZB_CODE=ZB_1_1_C2&amp;CBFYBS=1309" value="4851"/>
		<col format="" id="6" isLink="1" url="ZB_CODE=ZB_1_1_C3&amp;CBFYBS=1309" value="1028"/>
		<col format="##.##" id="7" isLink="0" value="70.16499405"/>
	</row>
	<row id="$011">
		<row code="1310" colspan="1" id="$011" name="XX市X处" rowspan="1"/>
		<col format="" id="1" isLink="0" url="ZB_CODE=ZB_1_C1&amp;CBFYBS=$(CBFYBS)$" value="0"/>
		<col format="" id="2" isLink="0" url="ZB_CODE=ZB_1_C2&amp;CBFYBS=$(CBFYBS)$" value="0"/>
		<col format="##.##" id="3" isLink="0" value="0"/>
		<col format="" id="4" isLink="0" url="ZB_CODE=ZB_1_1_C1&amp;CBFYBS=$(CBFYBS)$" value="0"/>
		<col format="" id="5" isLink="0" url="ZB_CODE=ZB_1_1_C2&amp;CBFYBS=$(CBFYBS)$" value="0"/>
		<col format="" id="6" isLink="0" url="ZB_CODE=ZB_1_1_C3&amp;CBFYBS=$(CBFYBS)$" value="0"/>
		<col format="##.##" id="7" isLink="0" value="0"/>
	</row>
	<row id="$012">
		<row code="1311" colspan="1" id="$012" name="XX市X处" rowspan="1"/>
		<col format="" id="1" isLink="1" url="ZB_CODE=ZB_1_C1&amp;CBFYBS=1311" value="3751"/>
		<col format="" id="2" isLink="1" url="ZB_CODE=ZB_1_C2&amp;CBFYBS=1311" value="5008"/>
		<col format="##.##" id="3" isLink="0" value="74.90015974"/>
		<col format="" id="4" isLink="1" url="ZB_CODE=ZB_1_1_C1&amp;CBFYBS=1311" value="3751"/>
		<col format="" id="5" isLink="1" url="ZB_CODE=ZB_1_1_C2&amp;CBFYBS=1311" value="5008"/>
		<col format="" id="6" isLink="1" url="ZB_CODE=ZB_1_1_C3&amp;CBFYBS=1311" value="268"/>
		<col format="##.##" id="7" isLink="0" value="71.09552691"/>
	</row>
   </result>
  </xreport>



要求根据用户需求,对指定的某一列的值(如第六列,则根据每一个id=”6”的value值进行排序),指定的排序顺序,进行排序,然后根据该顺序,交换每个行(即节点row的位置)的位置
2.此重点在于如何把子节点col与其父节点进行关联,并且,当排序列的值相同时,不能去除重复的值,必须都参与排序。开始考虑用一般的排序方法,但是不能把父节点关联起来,最后经他人提醒,用TreeMap来排序,把col的值作为TreeMap的key,父节点作为value。但TreeMap会自动去掉重复值,因此,当col节点值相同时,他只去一个,为解决此问题,吧col值与父节点row的id联合作为key。解决此问题
3.主要java代码如下:
public void sortByTreeMap() throws Exception   
    {   
        XPathFactory factory = XPathFactory.newInstance();   
        XPath xpath = (XPath) factory.newXPath();   
  
        DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();   
        domFactory.setNamespaceAware(true); // never forget this!   
        DocumentBuilder builder = domFactory.newDocumentBuilder();   
        Document doc = builder.parse("stat3.xml");   
  
        XPathExpression exprCol = xpath.compile("//row/col[@id='6']");   
        Object cols = exprCol.evaluate(doc, XPathConstants.NODESET);   
        NodeList colNodes = (NodeList) cols;   
           
  
        // 升序排序   
        Comparator comp = new Comparator()   
        {   
            //针对Float型的排序   
        /*  public int compare(Object o1, Object o2)  
            {  
                Float f1 = (Float) o1;  
                Float f2 = (Float) o2;  
                if (f1 == null && f2 == null)  
                {  
                    return 0;  
                }  
                else if (f1 == null)  
                {  
                    return -1;  
                }  
                else if (f2 == null)  
                {  
                    return 1;  
                }  
                else if (f1 == f2)  
                {  
                    return 1;  
                }  
                else  
                {  
                    return f1.compareTo(f2);  
                }  
            }*/  
               
            public int compare(Object o1, Object o2)   
            {   
                int i,j,k;   
                String strA,strB;   
  
                strA = (String)o1;   
                strB = (String)o2;   
  
                   
                i = strA.lastIndexOf('-');   
                j = strB.lastIndexOf('-'); 
//此处解决,当col节点值相等时,根据其父节点的id值排序,以免相等值被TreeMap自动剔除  
                k = new Float(strA.substring(0, i)).compareTo(new Float(strB.substring(0, j)));   
                if(k == 0)     
                    return new Float(strA.substring(i+2, strA.length())).compareTo(new Float(strB.substring(j+2, strB.length())));   
                else  
                   return k;   
            }   
        };   
           
        // 降序排列   
        Comparator compDesc = new Comparator()   
        {              
            public int compare(Object o1, Object o2)   
            {   
                int i,j,k;   
                String strA,strB;   
  
                strA = (String)o1;   
                strB = (String)o2;   
  
                   
                i = strA.lastIndexOf('-');   
                j = strB.lastIndexOf('-');   
                k = new Float(strB.substring(0, j)).compareTo(new Float(strA.substring(0, i)));   
                if(k == 0)     
                    return new Float(strB.substring(j+2, strB.length())).compareTo(new Float(strA.substring(i+2, strA.length())));   
                else  
                   return k;   
            }   
        };   
  
//      TreeMap treeMap = new TreeMap(comp);   
        TreeMap treeMap = new TreeMap(compDesc);   
       
//      Element resultElem = (Element) result.item(0) ;   
        for (int i = 0; i < colNodes.getLength(); i++)   
        {   
            Element colElem = (Element) colNodes.item(i);   
            Element parentElem = (Element) colElem.getParentNode();        
            //把col的值和对应的row 的id值组成一个字符串,以解决自动去除重复值的问题   
               
            treeMap.put(colElem.getAttribute("value") + "-" + parentElem.getAttribute("id"), parentElem);   
               
        }   
           
        Iterator iter = treeMap.entrySet().iterator();   
        XPathExpression exprResult = xpath.compile("//result");   
        Element resultNode = (Element) exprResult.evaluate(doc, XPathConstants.NODE);   
           
        int xuhao = 0;   
        String temp = "";   
                //排序后,交换行其父节点位置   
        while (iter.hasNext())   
        {   
            Map.Entry entry = (Map.Entry) iter.next();   
               
            Element newNode = (Element)entry.getValue() ;   
            resultNode.appendChild(newNode);   
           
        }   
        saveXML("stat3-paixuDesc.xml", doc, "gb2312") ;   
    }  


本文同步发表到本人CSDN博客:http://blog.csdn.net/antti_king/archive/2009/09/16/4557582.aspx


0
0
分享到:
评论

相关推荐

    对xml文件进行解析+排序+生成文件

    1. 定义一个接口处理文件,参数分别是列表文件路径和结果文件路径。 2. 将每个步骤单独写一个子方法,如解析xml,排序,写文件等等。

    java实验 排序GUI

    java实验 内容是有关排序的GUI 欢迎下载修改

    java 字符串 排序 源代码

    java程序,从键盘输入字符串知道按确定键结束输入,将字符串保存于一个文件中,再从文件读取出来进行排序,将排序后的字符串保存在另一个文件中,从屏幕打印出排序后的字符串。

    JAVA版BM25排序模型

    基于JAVA开发的BM25排序模型,文件格式为xml。压缩包中含有示例文件xml。

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part2

    1.3 关于xml的几个问题 3 1.4 xml与html的比较 4 1.4.1 xml将数据与显示分开 5 1.4.2 xml对文档的格式要求更加严格 6 1.4.3 xml有且只能有一个根元素 6 1.5 xml的编辑工具 7 1.6 xml文档 8 1.6.1 xml声明 9 ...

    java二叉排序

    java二叉排序程序示例,对输入的一系列的整数插入到xml文档中,xml的新手可以参考一下

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part3

    1.3 关于xml的几个问题 3 1.4 xml与html的比较 4 1.4.1 xml将数据与显示分开 5 1.4.2 xml对文档的格式要求更加严格 6 1.4.3 xml有且只能有一个根元素 6 1.5 xml的编辑工具 7 1.6 xml文档 8 1.6.1 xml声明 9 ...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part4

    1.3 关于xml的几个问题 3 1.4 xml与html的比较 4 1.4.1 xml将数据与显示分开 5 1.4.2 xml对文档的格式要求更加严格 6 1.4.3 xml有且只能有一个根元素 6 1.5 xml的编辑工具 7 1.6 xml文档 8 1.6.1 xml声明 9 ...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part5

    1.3 关于xml的几个问题 3 1.4 xml与html的比较 4 1.4.1 xml将数据与显示分开 5 1.4.2 xml对文档的格式要求更加严格 6 1.4.3 xml有且只能有一个根元素 6 1.5 xml的编辑工具 7 1.6 xml文档 8 1.6.1 xml声明 9 ...

    Java平台Excel文档处理类库API-Free Spire.XLS for Java

    1.功能:该API为适用于Java平台下,通过后端程序代码调用API接口操作Excel文档。通过方法可实现如下功能: 1.1 文档格式转换:Excel转PDF/图片/HTML/XPS/SVG/XML/CSV/TIFF/ET/ETT/OFD/、XML转Excel等。 1.2 文档...

    JAVA上百实例源码以及开源项目

     Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...

    sortpom:Maven插件,可帮助用户对pom.xml进行排序

    Sortpom Maven插件 ... 如果xml元素未排序,则mvn sortpom:verify仅对当前pom.xml文件进行排序。 此目标在验证pom是否已排序时会忽略文本格式(例如缩进和换行符)。 用法 Sortpom插件将对pom元素重新排序,并在

    java常用代码

    11.XmlReaer.java 读写xml文件 12.ArrayConvers.java 数组与map/list的转换 13.NumberCalc.java 对数字进行操作 14.ServerConn.java与ClientConn 先运行ServerConn.java 介绍了socket的通信 15.Arithmetic.java ...

    JAVA上百实例源码以及开源项目源代码

     Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...

    java-xml-to-json::alien_monster:将XML转换为保留结构的JSON表示形式

    这是一个将XML文档转换为JSON的项目。 它通过采用纪律严明的方法来创建简洁的JSON结构来实现此目的。 该库支持节点类型,例如注释和处理指令。 DTD在实验上受支持(将为它们创建一个节点),但是实体引用未打包,...

    XML轻松学习手册--XML肯定是未来的发展趋势,不论是网页设计师还是网络程序员,都应该及时学习和了解

    DTD是"有效XML文档"的必须文件,我们通过DTD文件来定义文档中元素和标识的规则及相互关系。如何建立一个DTD文件呢?让我们一起来学习: 1.设置元素 元素是XML文档的基本组成部分。你要在DTD中定义一个元素,然后...

    java jdk实列宝典 光盘源代码

    用dom处理xml文档; 用sax处理xml文档; 用xslt转换xml; 对象与xml的转换; 18 java mail 使用smtp协议发送简单邮件; 发送带附件的邮件; 给多人发送邮件; 使用pop3接收邮件; 19jsp与servlet 获取客户端的真实ip地址;...

    githup上开源项目 拖动排序 xml属性介绍

    githup上开源项目 拖动排序 xml属性介绍,个人总结文档。

    java开源包11

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

Global site tag (gtag.js) - Google Analytics