当前位置:Java -> 如何使用Java中的API查询XML文件

如何使用Java中的API查询XML文件

尽管当今技术领域存在一些显著缺点,XML仍然是一种强大的语言,在复杂数据存储场景中提供了关键优势。

例如,与流行的数据交换格式 JSON 相比,XML的语法更加注重机器可读性而非人类可读性,使其错误检查过程更加高效。 最重要的是,XML擅长存储具有多个变量的唯一数据类型,而JSON则针对相对简单而简洁的对象存储进行了优化。 XML的优缺点均源于它实际上并非像JSON那样是专门的数据交换格式; 相反,它是一种复杂的标记语言(与 HTML 相似),具有强大的数据交换能力。

当我们选择XML来存储复杂的数据关系时,我们可以开始利用强大的XML技术,如XQuery,以提取和操纵复杂数据以满足各种目的。 通过对XML文件执行查询的环境有一定的了解以及一个一致可靠的环境,我们可以扩展复杂XML数据的实用性。

在本文中,我们将简要回顾XQuery的工作原理(带有基本示例),并随后学习如何通过一对免费API(使用互补Java代码示例)对一个或多个XML文件运行查询。

理解XQuery

由于XML具有特征性的分层数据结构,从复杂的XML文件中查询内容并不那么复杂。

在XML数据中,关系以父子结构整洁地表示。这为形成良好的、有针对性的查询表达式提供了一条简单的路径,即使这些关系非常独特。 XML语法中的任何给定元素(类似于HTML,具有开放和关闭标签,例如<example> hello world </ example>)可以具有其自己的特定属性,并在其中包含多个附加元素或数据类型,我们可以使用XQuery有效地访问这些内容。

无论是尝试从XML文件中过滤和重复使用数据,将特定XML文件数据进行计算和报告的聚合,还是仅仅搜索存储在单个数据库中多个XML文件中的匹配数据,XQuery都能胜任。 它是XML技术家族的基础部分(与其表亲XPath和XSLT一起),在各种XML数据处理场景中提供了多样性。

简单的XQuery示例

XQuery的最基本用例是数据检索,因此让我们看一个简单示例,演示我们如何使用XQuery在XML文件中查找特定数据。

下面,我们有一个示例XML文件,其中存储了按流派分类的热门电影信息。 在每个流派元素中,我们有包括电影标题、电影导演、发行年份和电影票价在内的信息。

<?xml version="1.0" encoding="UTF-8"?>
<movies>
   
   <movie category="ACTION">
      <title lang="en">Inception</title>
      <director>Christopher Nolan</director>
      <year>2010</year>
      <ticket_price>10.00</ticket_price>
   </movie>
   
   <movie category="COMEDY">
      <title lang="en">The Grand Budapest Hotel</title>
      <director>Wes Anderson</director>
      <year>2014</year>
      <ticket_price>12.50</ticket_price>
   </movie>
   
   <movie category="DRAMA">
      <title lang="en">The Shawshank Redemption</title>
      <director>Frank Darabont</director>
      <year>1994</year>
      <ticket_price>8.00</ticket_price>
   </movie>
   
   <movie category="SCIFI">
      <title lang="en">Blade Runner 2049</title>
      <director>Denis Villeneuve</director>
      <year>2017</year>
      <ticket_price>15.00</ticket_price>
   </movie>
   
</movies>


通过在XQuery中编写声明性表达式(使用核心构造如ForLetWhereOrderReturn等),我们可以轻松地在一个或多个XML文件中过滤父子关系,并获取所需的数据。 XQuery利用XPath在文件中导航,同时应用上述构造来针对匹配元素采取特定操作。

假设我们想要查询上述示例文件,以检索关于票价超过10美元的电影的数据。 我们可以编写简单的XQuery字符串,如下所示:

for $movie in /movies/movie
where number($movie/ticket_price) > 10
return $movie


这将返回“大酒店布达佩斯”和“银翼杀手”两部电影的信息。

如何在哪里运行XQuery表达式

要执行针对一个或多个XML文件的XQuery表达式,我们需要通过XQuery处理器运行我们的表达式。 有几种不同的处理器可供选择。

例如,我们可以直接将XQuery表达式输入兼容存储XML文件的数据库中。 对于本地开发项目,当我们使用流行的编程语言如 Java 时,我们可以使用内置技术运行XQuery表达式。 我们甚至可以搜索并利用在线工具来针对一个XML文件一次性运行XQuery表达式。

除了上述选项之外,我们还可以利用专门的Web API,将XQuery表达式处理从本地服务器中抽象出来。 如果我们的XML文件存储在不兼容XQuery的数据库之外,这个选项代表了一种高度可扩展、低维护和经济高效的解决方案,可用于查询我们的XML内容。

在页面的后面,我们将看一下两个免费API,我们可以使用这两个API通过multipart/form-data请求查询一个或多个XML文件。

演示

使用以下提供的互补、可直接运行的Java代码示例,我们可以利用两个分开优化的API,通过单个请求传递文件路径和XQuery表达式来对一个或多个XML文件进行查询。 为了授权我们的请求,我们只需要一个免费的API密钥,每月进行800次请求。

客户端SDK安装

我们可以通过安装客户端SDK来开始构建我们的API调用。

  • 在我们的Maven POM文件中,让我们添加一个对库的引用(JitPack用于动态编译库):
<repositories>
    <repository>
        <id>jitpack.io</id>
        <url>https://jitpack.io</url>
    </repository>
</repositories>


  • 然后,让我们添加对依赖项的引用:
<dependencies>
<dependency>
    <groupId>com.github.Cloudmersive</groupId>
    <artifactId>Cloudmersive.APIClient.Java</artifactId>
    <version>v4.25</version>
</dependency>
</dependencies>


现在我们可以开始调用每个单独的API功能。

添加导入类和调用函数

  • 使用以下第一组示例代码,我们可以调用一个专门优化用于查询单个XML文档的API。 假定XML文档会自动加载为默认上下文; 要访问文档中的元素,只需引用它们,无需引用文档:
// Import classes:
//import com.cloudmersive.client.invoker.ApiClient;
//import com.cloudmersive.client.invoker.ApiException;
//import com.cloudmersive.client.invoker.Configuration;
//import com.cloudmersive.client.invoker.auth.*;
//import com.cloudmersive.client.ConvertDataApi;

ApiClient defaultClient = Configuration.getDefaultApiClient();

// Configure API key authorization: Apikey
ApiKeyAuth Apikey = (ApiKeyAuth) defaultClient.getAuthentication("Apikey");
Apikey.setApiKey("YOUR API KEY");
// Uncomment the following line to set a prefix for the API key, e.g. "Token" (defaults to null)
//Apikey.setApiKeyPrefix("Token");

ConvertDataApi apiInstance = new ConvertDataApi();
File inputFile = new File("/path/to/inputfile"); // File | Input XML file to perform the operation on.
String xquery = "xquery_example"; // String | Valid XML XQuery 3.1 or earlier query expression; multi-line expressions are supported
try {
    XmlQueryWithXQueryResult result = apiInstance.convertDataXmlQueryWithXQuery(inputFile, xquery);
    System.out.println(result);
} catch (ApiException e) {
    System.err.println("Exception when calling ConvertDataApi#convertDataXmlQueryWithXQuery");
    e.printStackTrace();
}


  • 使用以下示例,我们可以调用一个专门优化用于查询多个XML文档的API。 请注意,如果包括两个命名文档,则可以按名称(例如,“movies.xml”或“books.xml”)参考给定文档的内容。 如果我们的输入文件不包含文件名,则它们将默认为文件名如“input1.xml”、“input2.xml”等。
// Import classes:
//import com.cloudmersive.client.invoker.ApiClient;
//import com.cloudmersive.client.invoker.ApiException;
//import com.cloudmersive.client.invoker.Configuration;
//import com.cloudmersive.client.invoker.auth.*;
//import com.cloudmersive.client.ConvertDataApi;

ApiClient defaultClient = Configuration.getDefaultApiClient();

// Configure API key authorization: Apikey
ApiKeyAuth Apikey = (ApiKeyAuth) defaultClient.getAuthentication("Apikey");
Apikey.setApiKey("YOUR API KEY");
// Uncomment the following line to set a prefix for the API key, e.g. "Token" (defaults to null)
//Apikey.setApiKeyPrefix("Token");

ConvertDataApi apiInstance = new ConvertDataApi();
File inputFile1 = new File("/path/to/inputfile"); // File | First input XML file to perform the operation on.
String xquery = "xquery_example"; // String | Valid XML XQuery 3.1 or earlier query expression; multi-line expressions are supported
File inputFile2 = new File("/path/to/inputfile"); // File | Second input XML file to perform the operation on.
File inputFile3 = new File("/path/to/inputfile"); // File | Third input XML file to perform the operation on.
File inputFile4 = new File("/path/to/inputfile"); // File | Fourth input XML file to perform the operation on.
File inputFile5 = new File("/path/to/inputfile"); // File | Fifth input XML file to perform the operation on.
File inputFile6 = new File("/path/to/inputfile"); // File | Sixth input XML file to perform the operation on.
File inputFile7 = new File("/path/to/inputfile"); // File | Seventh input XML file to perform the operation on.
File inputFile8 = new File("/path/to/inputfile"); // File | Eighth input XML file to perform the operation on.
File inputFile9 = new File("/path/to/inputfile"); // File | Ninth input XML file to perform the operation on.
File inputFile10 = new File("/path/to/inputfile"); // File | Tenth input XML file to perform the operation on.
try {
    XmlQueryWithXQueryMultiResult result = apiInstance.convertDataXmlQueryWithXQueryMulti(inputFile1, xquery, inputFile2, inputFile3, inputFile4, inputFile5, inputFile6, inputFile7, inputFile8, inputFile9, inputFile10);
    System.out.println(result);
} catch (ApiException e) {
    System.err.println("Exception when calling ConvertDataApi#convertDataXmlQueryWithXQueryMulti");
    e.printStackTrace();
}


现在我们有了一种简单的方法,可以逐个文件或批量使用多个文件查询我们的XML文件中的内容。

摘要

通过使用API来处理我们的XQuery字符串,而不是使用内置函数或开源库,我们将查询操作从服务器中抽象出来,最大限度地减少了我们需要运行的代码量。我们介绍了一种简单的解决方案,用于定位和聚合XML数据,而无需担心将来更新或维护。

当然,重要的是要注意,API并不适用于每个项目。因此,我们需要根据自己的判断来确定在应用架构中何时何地使用web API调用是合适的。

推荐阅读: C++高频面试题

本文链接: 如何使用Java中的API查询XML文件