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函数完成条件查询。
这段代码可在esProc的IDE中调试/执行,存为脚本文件(比如condition.dfx),只需通过esProc的JDBC接口在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 数据解析与计算