Java 解析和处理 XML 用哪个开源包最好?

 

很长时间以来,Java 已经提供了 SAX 和 DOM 内置实现,解析 XML 不需要外部库。为了简化 XML 处理需求,高级声明性语言 XQuery、XPath 等应运而生,可以满足的 XML 条件查询需求,但条件查询只是数据计算很小的一部分,实际工作中还应包括排序、去重、分组、聚合等才更方便。其实,如果是面向 XML 数据计算的需求,用 Open-esProc 更方便。但 Open-esProc 和一般 Java 包有所不同,是将数据类型和计算方法封装到一个叫 SPL 的脚本语言中,然后在 Java 程序中调用 SPL 脚本,返回 ResultSet 对象。

先举个简单的例子说明 Open-esProc 如何使用。文件 Employees_Orders.xml 存储一批员工信息,以及属于员工的多个订单,部分数据如下。查询出所有价格在 1000-3000,且客户名包含 bro 字样的订单。

<?xml version="1.0"   encoding="UTF-8"?>
<xml>
<row>
         <EId>2</EId>
         <State>"New   York"</State>
         <Dept>"Finance"</Dept>
         <Name>"Ashley"</Name>
         <Gender>"F"</Gender>
         <Salary>11000</Salary>
         <Birthday>"1980-07-19"</Birthday>
<Orders>[]</Orders>
</row>
<row>
         <EId>3</EId>
         <State>"New   Mexico"</State>
         <Dept>"Sales"</Dept>
         <Name>"Rachel"</Name>
         <Gender>"F"</Gender>
         <Salary>9000</Salary>
         <Birthday>"1970-12-17"</Birthday>
         <Orders>
                  <OrderID>32</OrderID>
                  <Client>"JFS"</Client>
                  <SellerId>3</SellerId>
                  <Amount>468.0</Amount>
                  <OrderDate>"2009-08-13"</OrderDate>
         </Orders>
         <Orders>
                  <OrderID>39</OrderID>
                  <Client>"NR"</Client>
                  <SellerId>3</SellerId>
                  <Amount>3016.0</Amount>
                  <OrderDate>"2010-08-21"</OrderDate>
                  </Orders>
         <Orders>
</row>
…
<xml>

用 SPL 查询如下:


A

1

=xml(file("D:\\xml\\Employees_Orders.xml").read(),"xml/row")

2

=A1.conj(Orders)

3

=A2.select(Amount>100 && Amount<=3000   && like@c(Client,"*bro*"))

上面代码先将XML读为多层的序表对象,再用conj函数合并所有订单,之后用select函数完成条件查询。

这段代码可在esProcIDE中调试/执行,存为脚本文件(比如condition.dfx),只需通过esProcJDBC接口在JAVA中调用,就能轻松与 Java 程序集成在一起,具体代码如下:

package Test;
  import java.sql.Connection;
  import java.sql.DriverManager;
  import java.sql.ResultSet;
  import java.sql.Statement;
  public class test1 {
      public static void main(String[]   args)throws Exception {
          Class.forName("com.esproc.jdbc.InternalDriver");
          Connection connection =DriverManager.getConnection("jdbc:esproc:local://");
          Statement statement =   connection.createStatement();
          ResultSet result =   statement.executeQuery("call condition()");
          printResult(result);
          if(connection != null)   connection.close();
      }
…
}

类似地,esProc 可以实现分组汇总,代码如下:

=A2.groups(year(OrderDate);sum(Amount))

或关联计算:

=A1.new(Name,Gender,Dept,Orders.OrderID,Orders.Client,Orders.SellerId,Orders.Amount,Orders.OrderDate)

从上面代码可以看出,esProc 语法表达能力很强,不仅可以完成常用的计算,且代码简短易懂,解耦 XML 计算,当需求有变动时,只需需改 SPL 脚本即可。esProc 的序表类型支持多层数据,支持直观的点操作符,在实现关联计算时可直接从多层数据取值,代码更加简练。更多计算示例,参考 XML 数据解析与计算