65.9K
CodeProject 正在变化。 阅读更多。
Home

检索和解析 XML 格式的 API 数据。

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.88/5 (5投票s)

2014年7月31日

CPOL

7分钟阅读

viewsIcon

23899

downloadIcon

193

有用的学习应用程序,用于检索、解析 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 需要参数。 

三个参数是

  1. uid - 您的 API 用户 ID。
  2. tokenid - 您的开发人员令牌 ID。
  3. 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 树是本例的设计,但有时子根内部也可能包含子根。理解树是构建程序以从树中获取正确信息的唯一方法。

使用代码

This is the sample program in the source code. Simple but effective.

现在您已经了解了什么是 API、API 密钥的重要性以及基本的 XML 数据结构,让我们来编写一个程序。 

如果您认为合适,我将把所有的设计和基本的项目创建留给您。

获取查询

要获取查询,我们将需要创建一个 WebRequestWebRequest 引用位于 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 服务的支持人员。 

 

© . All rights reserved.