检索和解析 XML 格式的 API 数据。
有用的学习应用程序,用于检索、解析 API XML 文档并将其格式化为用户友好的文本。
引言
对于处理 API XML 数据的新手来说,如何接收和处理收到的信息可能是一个令人困惑的问题。获取信息的方法有数百种,这可能会增加新开发人员的困惑。
因此,我创建了一个简单且通用的应用程序。它在获取信息的方法上极其直截了当。
理解代码
选择一个非常基本的 API(在本例中用于获取定义),该应用程序能够获取、解析、格式化并将信息输出为用户可读的格式。让我们来看看如何做到这一点。
API 须知
连接到 API 服务时,大多数情况下,服务会要求您注册并申请获取一个 API 密钥。然后,大多数情况下,该密钥将被要求输入到查询中。在编程中,查询可能意味着许多不同的事情。 最终,查询是您从 API 服务获取信息到您的应用程序的桥梁。
首先,查看您是否可以 获取所需 API 服务的 API 密钥 (如果需要)。如果没有密钥,查询将失败。API 密钥是您访问 API 服务的钥匙。如果没有 API 密钥访问权限,花费时间开发一个无用的应用程序是没有意义的。
在此应用程序中,我使用了 STANDS4 Web 服务:字典定义 API。点击底部的“Apply here”并按照说明获取 API 密钥以使用此应用程序。虽然不是必需的,但强烈建议这样做。
STANDS4 查询是一个 请求 URL。请求 URL 是一种通过使用 参数 从网页获取信息的查询类型。
这是请求 URL
http://www.stands4.com/services/v2/defs.php
如果您点击它,您将收到错误。原因在于此请求 URL 需要参数。
三个参数是
- uid - 您的 API 用户 ID。
- tokenid - 您的开发人员令牌 ID。
- word - 您想要获取定义的单词。
因此,一个示例请求 URL 将如下所示
http://www.stands4.com/services/v2/defs.php?uid=[youruidkey]&tokenid=[yourtokenidkey]&word=[wordtosearch]
这将是查询请求 URL。程序真正的核心。
理解 XML 数据
我们现在有了查询的请求 URL。那么我们该怎么做呢?我们可以在网络浏览器上测试它,看看它提供什么信息。这将是您的 示例响应。示例响应可以有多种不同的信息格式(文本、XML、Json、图片等)。本例使用 XML 格式。
一个示例响应如下
<?xml version="1.0" encoding="UTF-8"?> <results> <result> <term>consistent, uniform</term> <definition>the same throughout in structure or composition</definition> <partofspeech>adj</partofspeech> <example>bituminous coal is often treated as a consistent and homogeneous product</example> </result> </results>
在顶部您将看到信息格式,这一点非常重要,因为不同的格式会有不同的处理方法。
XML 数据以树形结构表示。一切都分支到另一件事。起始分支是“results”,这被称为根。在根内部可以有许多子根。本例只有一个名为“result”的子根。在子根内部,您将获得响应元素。这些是您将在应用程序中使用的信息。
示例响应元素是
- term - 字符串
- definition - 字符串
- partofspeech - 字符串
- example - 字符串
请注意这些元素。稍后您需要记住它们的名称。
请注意,虽然此 XML 树是本例的设计,但有时子根内部也可能包含子根。理解树是构建程序以从树中获取正确信息的唯一方法。
使用代码
现在您已经了解了什么是 API、API 密钥的重要性以及基本的 XML 数据结构,让我们来编写一个程序。
如果您认为合适,我将把所有的设计和基本的项目创建留给您。
获取查询
要获取查询,我们将需要创建一个 WebRequest
。WebRequest
引用位于 System.Net 中。
您需要使用“using
”命令在应用程序顶部添加该引用。
using System.Net;
同样在类下,我们需要创建一个应用程序范围的变量。虽然您可以将变量包含在 void 中,但如果您要重用变量,最好将它们始终保留在内存中。将它们设置为应用程序范围的变量可以加快查询的响应时间。
在 public partial class [yourformname]
: Form 括号下,请输入:
WebResponse webResponse;
现在我们需要创建一个带有字符串的私有 void(以便我们可以获取搜索词)。
private void Query(string word) { }
在新的私有 void 的括号中添加以下代码
var webRequest = WebRequest.Create([Request URL]);
这将为查询创建一个变量。我们可以用它做各种各样的事情。
现在让我们尝试获取查询。关键词是尝试,如果查询无效,我们将无法获得任何可以使用的东西。因此,必须有 try 和 catch 命令。
try { webResponse = webRequest.GetResponse(); } catch (WebException) { textbox.Text = "No internet connection."; return; } catch (Exception e) { textbox.Text = "Something went wrong." + e; return; }
这将从 API 服务获取响应。如果用户未连接到互联网,它将引发 WebException
,显示错误消息“无互联网连接”。如果出现问题,但与互联网无关,它将显示错误消息“出现问题”以及异常信息。
接下来我们将连接到 API 服务
var appCastStream = webResponse.GetResponseStream();
这将使用 Request URL 从 API 服务打开一个流。
现在,如果 Request URL 无效并返回空值,我们可能会遇到问题。因此,让我们检查它是否不为空
if (appCastStream != null) { receivedAppCastDocument.Load(appCastStream); } else { textbox.Text = "API is down. Please try again later"; return; }
如果从查询中获取到信息,它将把信息加载到我们的应用程序中。
ReceivedAppCastDocument
是 System.XML 引用。 请务必将其添加到您的 using 列表中
using System.Xml;
干得好!我们现在已经从查询中获取了信息!
解析
唯一剩下要做的就是从查询中获取信息。这种检索行为称为解析。ReceivedAppCastDocument
使其变得极其容易。
这也是在浏览器中打开示例请求的用武之地。
我们现在将记住示例请求 XML 树的结构。这是为了构建一个索引来解析信息。它将告诉计算机确切地在哪里找到信息以及如何处理它。
var result = receivedAppCastDocument.SelectNodes("results/result");
ReceivedAppCastDocument.SelectNodes
创建 XML 的 Xpath。这会构建索引。“results/result”是到达响应元素的树。首先是根,然后是子根。如果您有不同的根和子根名称,请相应地更改。请注意,从这里开始,字母大小写必须完全一致。
现在让我们检查是否有任何响应元素
if (result != null) { }
这会检查结果是否为空。如果不为空,则继续执行。这很酷的一点是,我们可以添加一个“else
”语句,并在没有响应元素时执行一些操作。
现在情况变得复杂了。我们现在将从响应元素中选择和获取信息,但是,如果存在许多包含响应元素的子根,我们需要确保我们不会覆盖它们。听起来很复杂?但是解决方案就像创建一个 foreach 命令一样简单。
foreach (XmlNode item in result) { var term = item.SelectSingleNode("term").InnerText; var partofspeech = item.SelectSingleNode("partofspeech").InnerText; var definition = item.SelectSingleNode("definition").InnerText; var example = item.SelectSingleNode("example").InnerText; }
正如您所看到的,将变量分配给响应元素并不难。这个 foreach 命令创建一个新的“item”,可以对其进行索引以获取响应元素的 InnerText。因为它是一个 foreach 命令,所以它对每个子根都执行此操作。
现在您已经将查询中的信息存储在字符串变量中,可以随意使用。我总是建议检查变量是否有效/不为空。要在字符串上执行此操作,您需要创建一个 if 语句。
if (term != "") { } else { }
这可以抵消格式中的任何空白。
结论
如果您真的读完了所有这些,恭喜!我希望您学到了很多。
测试随附的示例源代码。希望它能帮助您理解。
祝好!
如果您喜欢它,请务必给我评分。
附注:请记住,并非每个 Xml 文档都相同,有些可能比此示例复杂得多。如果您遇到 API 格式问题,获得答案的最佳方法是联系该 API 服务的支持人员。