`
antti
  • 浏览: 66110 次
  • 性别: 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
分享到:
评论

相关推荐

    Java解析和生成XML.pdf

    Java解析和生成XML的知识点主要涵盖了使用JAXB(Java Architecture for XML Binding)框架...通过这种方式,可以很好地将Java对象转换为XML格式,并能够将XML文档内容重新解析回Java对象,实现数据的持久化存储和传输。

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

    在Python中,可以使用`xml.etree.ElementTree`库,它提供了方便的API来解析和操作XML文档。例如,我们可以使用`ElementTree.parse()`函数加载XML文件,并通过`ElementTree.Element`对象遍历和提取数据。 接下来是...

    XML分页排序数据岛

    1. **创建XML数据源**:在后台,你需要生成一个包含所需数据的XML文档。这个文档可以由服务器端的语言(如ASP.NET、PHP、Java等)动态生成,也可以是静态的XML文件。 2. **绑定数据源**:将生成的XML数据源绑定到...

    xml实现二叉树排序

    5. **导出XML**:将生成的XML字符串写入文件,形成一个XML文档。这可以通过编程语言提供的文件操作API来实现,例如在Python中使用`xml.etree.ElementTree`模块,或者在Java中使用`DOM`或`JAXB`库。 6. **解析和验证...

    JAVA版BM25排序模型

    综上所述,JAVA版的BM25排序模型是一个结合了信息检索、自然语言处理和JAVA编程技术的系统,它可以高效地处理文本数据,提供高质量的文档排名结果。理解并掌握这些知识点对于开发和维护这样的系统至关重要。

    SAX解析XML文件以及排序

    3. 实现`ContentHandler`接口,覆盖其中的回调方法,如`startElement()`、`endElement()`等,这些方法将在解析过程中被调用,用于处理XML文档的结构。 4. 将自定义的`ContentHandler`对象设置到`SAXParser`中。 5. ...

    java 字符串 排序 源代码

    7. **源代码结构**:`Sort.java`文件可能包含了主程序类,其中包含了键盘输入、文件操作和排序的逻辑。它可能有一个`main`方法作为程序的入口点,以及其他的辅助方法来实现具体功能。 8. **编程实践**:良好的编程...

    java实验 排序GUI

    在本Java实验中,我们关注的是“排序GUI”的实现,这是一个结合了编程逻辑与用户界面设计的项目。这个实验的核心目标是创建一个图形用户界面(GUI),用户可以通过它来执行各种排序算法,如冒泡排序、选择排序、插入...

    java二叉排序

    总之,“java二叉排序”结合了数据结构(二叉搜索树)和数据交换格式(XML),提供了在Java环境中对整数序列进行排序并将其持久化到XML文档的方法。这样的练习可以帮助开发者深化对两者概念的理解,并提高解决问题的...

    Java-XML学习手册

    - **自我描述**:XML文档包含关于自身数据结构的信息,使得数据易于理解。 - **标准化**:XML是由W3C(World Wide Web Consortium)制定的标准,具有广泛的行业支持。 - **独立性**:XML是一种公共格式,不属于任何...

    Java_XML入门及处理实例

    - **DOM (Document Object Model)**:提供了一个面向对象的API来解析XML文档,使得开发者可以以树形结构操作XML文档。 - **SAX (Simple API for XML)**:这是一种基于事件的模型,适用于大型XML文件的处理,因为它不...

    Java+XML写的RSS阅读器

    Java的内置`java.sql`库可以连接数据库进行数据存储,或者使用NoSQL数据库如MongoDB,或者JSON文件来存储数据。 7. **错误处理**:在处理网络请求和XML解析时,错误处理至关重要。Java的异常处理机制(try-catch-...

    java对大数据量文件内容的多线程读取和排序.pdf

    Java 对大数据量文件内容的多线程读取和排序 在处理大数据量文件内容时,多线程读取和排序是非常重要的。下面我们将讨论如何使用 Java 对大数据量文件内容进行多线程读取和排序。 首先,我们需要生成一个随机的...

    用类来存储XMl 文件的数据-XML文件解析

    5. 存储和操作数据:现在,我们已经将XML文件的数据转换为Java对象,可以方便地进行各种操作,如排序、搜索、更新等。这些对象可以存储在集合(如ArrayList)中,或者持久化到数据库中。 6. 序列化和反序列化:为了...

    Java 中文排序 使用pinyin4j组件

    在Java编程语言中,对中文字符串进行排序是一个相对复杂的问题,因为中文字符的排序不能简单地按照Unicode编码顺序来处理。通常,我们需要考虑汉字的拼音或者笔画等属性来进行排序。这里我们将详细介绍如何使用`...

    java操作xml

    Java操作XML是一个广泛的议题,涵盖了从解析XML文档到创建、修改和序列化XML的各种技术。在Java中,处理XML的主要库有DOM(Document Object Model)、SAX(Simple API for XML)和StAX(Streaming API for XML)。...

    XML_java_Dom的考生成绩管理

    Java DOM(Document Object Model)是处理XML文档的一种方式,它提供了访问和操作XML文档的API,允许程序员通过Java代码来创建、修改和遍历XML文档。 在“XML_java_Dom的考生成绩管理”这个项目中,我们可能涉及到...

    Java程序员的10道XML面试题

    这种方式适合于需要频繁读写XML文档的场合,但对于大型文档来说,由于需要加载整个文档到内存,可能会导致性能问题。 **SAX (Simple API for 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 ...

Global site tag (gtag.js) - Google Analytics