我想向 Web 服务发出请求,获取 XML 内容,然后解析它以获取服务返回的特定值。
代码将使用本机 C++11 (MS Visual Studio 2013) 编写。选择了Cassablanca PPL 库。对于 XML 解析,选择了 XmlLite。
我习惯了 C++ 编程;然而,PPL 库中的异步任务编程——方法——对我来说是新的。我知道什么是异步编程,也知道并行编程的原理。但是,我不习惯使用延续 ( .then(...)
),我只是慢慢地围绕这个概念展开思考。
到目前为止,我已经修改了示例以获取 XML 结果并将其写入文本文件:
// Open a stream to the file to write the HTTP response body into.
auto fileBuffer = std::make_shared<concurrency::streams::streambuf<uint8_t>>();
file_buffer<uint8_t>::open(L"test.xml", std::ios::out)
.then([=](concurrency::streams::streambuf<uint8_t> outFile) -> pplx::task < http_response >
{
*fileBuffer = outFile;
// Create an HTTP request.
// Encode the URI query since it could contain special characters like spaces.
// Create http_client to send the request.
http_client client(L"http://api4.mapy.cz/");
// Build request URI and start the request.
uri_builder builder(L"/geocode");
builder.append_query(L"query", address);
return client.request(methods::GET, builder.to_string());
})
// Write the response body into the file buffer.
.then([=](http_response response) -> pplx::task<size_t>
{
printf("Response status code %u returned.\n", response.status_code());
return response.body().read_to_end(*fileBuffer);
})
// Close the file buffer.
.then([=](size_t)
{
return fileBuffer->close();
})
// Wait for the entire response body to be written into the file.
.wait();
现在,我需要了解如何修改代码以获取可以使用 XmlLite 的结果(Microsoft 实现,如xmllite.h
、xmllite.lib
和xmllite.dll
在 PPL 相关的流和其他类中仍然有点迷失。我不知道如何正确使用它们。非常欢迎任何解释。
cassablanca 的人说他们使用 XmlLite 和 Cassablanca 来处理结果,但我没有找到任何示例。你能指点我一些吗?谢谢。
更新(2014 年 6 月 4 日):上面的代码实际上被包装成这样的函数(wxString
来自 wxWidgets,但可以很容易地用std::string
or替换它std::wstring
):
std::pair<double, double> getGeoCoordinatesFor(const wxString & address)
{
...the above code...
...here should be the XML parsing code...
return {longitude, latitude};
}
实际上,目标不是将流写入test.xml
文件以提供 XmlLite 解析器。XML 相当小,它包含一个或多个(如果地址不明确)带有我要提取的 x 和 y 属性的项目元素——就像这样:
<?xml version="1.0" encoding="utf-8"?>
<result>
<point query="Vítězství 27, Olomouc">
<item
x="17.334045"
y="49.619723"
id="9025034"
source="addr"
title="Vítězství 293/27, Olomouc, okres Olomouc, Česká republika"
/>
<item
x="17.333067"
y="49.61618"
id="9024797"
source="addr"
title="Vítězství 27/1, Olomouc, okres Olomouc, Česká republika"
/>
</point>
</result>
我不需要那个test.xml
文件。如何获取流以及如何将其重定向到 XmlLite 解析器?