当前位置:Java -> 如何使用Java中的API查询XML文件
尽管当今技术领域存在一些显著缺点,XML仍然是一种强大的语言,在复杂数据存储场景中提供了关键优势。
例如,与流行的数据交换格式 JSON 相比,XML的语法更加注重机器可读性而非人类可读性,使其错误检查过程更加高效。 最重要的是,XML擅长存储具有多个变量的唯一数据类型,而JSON则针对相对简单而简洁的对象存储进行了优化。 XML的优缺点均源于它实际上并非像JSON那样是专门的数据交换格式; 相反,它是一种复杂的标记语言(与 HTML 相似),具有强大的数据交换能力。
当我们选择XML来存储复杂的数据关系时,我们可以开始利用强大的XML技术,如XQuery,以提取和操纵复杂数据以满足各种目的。 通过对XML文件执行查询的环境有一定的了解以及一个一致可靠的环境,我们可以扩展复杂XML数据的实用性。
在本文中,我们将简要回顾XQuery的工作原理(带有基本示例),并随后学习如何通过一对免费API(使用互补Java代码示例)对一个或多个XML文件运行查询。
由于XML具有特征性的分层数据结构,从复杂的XML文件中查询内容并不那么复杂。
在XML数据中,关系以父子结构整洁地表示。这为形成良好的、有针对性的查询表达式提供了一条简单的路径,即使这些关系非常独特。 XML语法中的任何给定元素(类似于HTML,具有开放和关闭标签,例如<example> hello world </ example>
)可以具有其自己的特定属性,并在其中包含多个附加元素或数据类型,我们可以使用XQuery有效地访问这些内容。
无论是尝试从XML文件中过滤和重复使用数据,将特定XML文件数据进行计算和报告的聚合,还是仅仅搜索存储在单个数据库中多个XML文件中的匹配数据,XQuery都能胜任。 它是XML技术家族的基础部分(与其表亲XPath和XSLT一起),在各种XML数据处理场景中提供了多样性。
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中编写声明性表达式(使用核心构造如For
、Let
、Where
、Order
、Return
等),我们可以轻松地在一个或多个XML文件中过滤父子关系,并获取所需的数据。 XQuery利用XPath在文件中导航,同时应用上述构造来针对匹配元素采取特定操作。
假设我们想要查询上述示例文件,以检索关于票价超过10美元的电影的数据。 我们可以编写简单的XQuery字符串,如下所示:
for $movie in /movies/movie
where number($movie/ticket_price) > 10
return $movie
这将返回“大酒店布达佩斯”和“银翼杀手”两部电影的信息。
要执行针对一个或多个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来开始构建我们的API调用。
<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功能。
// 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();
}
// 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文件