如何在自适应对话框 HttpRequest 中从 xml 转换为 json?

Posted

技术标签:

【中文标题】如何在自适应对话框 HttpRequest 中从 xml 转换为 json?【英文标题】:How to convert from xml to json within Adaptive dialog HttpRequest? 【发布时间】:2020-11-01 18:44:48 【问题描述】:

我是 Bot Framework 和 C# 的新手。我正在使用带有核心航班预订模板 (adaptive-dialog/03.core-bot) 的自适应对话框构建聊天机器人。我想调用 API 来获取天气信息。此 OpenWeather API 可以返回 JSON、XML 或 html 格式的数据。当响应是 JSON 格式时,很容易访问键值对。但是当响应是 XML 格式时,所有内容都将转换为字符串并保存为响应中的“内容”,我必须将其转换为 JSON 或字典,以便我可以访问详细信息。而且我需要将 API 响应保存为对话框中的属性以供以后参考。

我知道我们可以使用以下代码将 XML 转换为 JSON,但问题是如何在自适应对话框中进行。我尝试在 HttpRequest 块中包含以下代码,但收到错误 “XmlDocument 是一种类型,在给定的上下文中无效。” 似乎您无法在自适应对话框,你可以做的只是使用模板可以提供的,但是现在 HttpRequest 类没有解析 XML 响应的选项。谁能给我一些指导?谢谢!

XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);

string json = JsonConvert.SerializeXmlNode(doc);

在自适应对话框中生成 HttpRequest 的代码:

new IfCondition()

    Condition = "conversation.Id != null",
    Actions = new List<Dialog>()
    
        new HttpRequest()
        
            Url = "http://api.openweathermap.org/data/2.5/weatherq=Detroit&mode=xml&appid=appid=your api key",
            ResultProperty = "dialog.httpResponse",
            Method = HttpRequest.HttpMethod.GET,
            ResponseType = HttpRequest.ResponseTypes.Json
        ,
        new Send Activity("$dialog.httpResponse"),
        new Send Activity("$dialog.httpResponse.content")
    

下面显示了 HttpRequest 响应的样子。 OpenWeather API 响应(XML 格式)被转换为字符串作为 'content' 的值。


    "statusCode": 200,
    "reasonPhrase": "OK",
    "headers": 
    
        "Server": "openresty",
        "Date": "Tue, 14 Jul 2020 18:57:41 GMT",
        "Connection": "keep-alive",
        "X-Cache-Key": "/data/2.5/weather?mode=xml&q=detroit",
        "Access-Control-Allow-Origin": "*",
        "Access-Control-Allow-Credentials": "true",
        "Access-Control-Allow-Methods": "GET, POST"
    ,
    "content": "<?xml version="1.0" encoding="UTF-8"?>\n
                <current>
                    <city id="4990729" name="Detroit">
                        <coord lon="-83.05" lat="42.33"></coord> 
                        <country>US</country>
                        <timezone>-14400</timezone>
                        <sun rise="2020-07-14T10:08:16" set="2020-07-15T01:07:33"></sun>
                    </city>
                    <temperature value="301.11" min="300.15" max="302.59" unit="kelvin"></temperature>
                    <feels_like value="301.1" unit="kelvin"></feels_like> 
                    <humidity value="44" unit="%"></humidity>
                    <pressure value="1019" unit="hPa"></pressure>
                    <wind>
                        <speed value="2.1" unit="m/s" name="Light breeze"></speed>
                        <gusts></gusts>
                        <direction></direction>
                    </wind>
                    <clouds value="75" name="broken clouds"></clouds>
                    <visibility value="16093"></visibility>
                    <precipitation mode="no"></precipitation>
                    <weather number="803" value="broken clouds" icon="04d"></weather>
                    <lastupdate value="2020-07-14T18:57:41"></lastupdate> 
               </current>"

【问题讨论】:

欢迎来到 Stack Overflow。您是否愿意编辑您的帖子,以便您的 JSON 是格式化的代码块而不是屏幕截图?请查看方便的指南,了解您可以采取哪些步骤来更快地获得更好的答案:***.com/help/how-to-ask 感谢您的评论,@KyleDelaney。我已根据您的建议更新了问题,JSON 响应的屏幕截图已替换为格式化的代码块。 您说“这个 OpenWeather API 可以返回 JSON、XML 或 HTML 格式的数据。”那么,您为什么不直接获取 JSON 格式的数据呢?你能链接到 API 文档吗? 感谢您的回复,凯尔。实际上,我只是在这里使用 OpenWeather API 作为示例,由于隐私问题,我无法透露我需要调用的实际 API。对于实际的 API,只有 XML 格式的响应,否则我可以直接使用 JSON 响应。谢谢。 【参考方案1】:

您可以使用代码操作。

new IfCondition()

    Condition = "conversation.Id != null",
    Actions = new List<Dialog>()
    
        new HttpRequest()
        
            Url = "http://api.openweathermap.org/data/2.5/weatherq=Detroit&mode=xml&appid=appid=your api key",
            ResultProperty = "dialog.httpResponse",
            Method = HttpRequest.HttpMethod.GET,
            ResponseType = HttpRequest.ResponseTypes.Json
        ,
        new CodeAction(async (dc, options) =>
        
            var xml = dc.State.GetValue("dialog.httpResponse.content", () => "<root></root>");
            var doc = new XmlDocument();

            doc.LoadXml(xml);

            var json = JsonConvert.SerializeXmlNode(doc);

            dc.State.SetValue("dialog.json", json);

            return await dc.EndDialogAsync();
        ),
        new SendActivity("$dialog.json"),
    

【讨论】:

谢谢你,凯尔!我试图使用CodeAction,但不知道如何访问自定义代码中的dialog.httpResponse。您提供的上述代码效果很好。我又添加了一行来解析 json,以便可以从dialog.json 直接访问键值对。在var json = JsonConvert.SerializeXmlNode(doc);之后,我添加了var json_final = JObject.Parse(json);,然后将json_final设置为dialog.json的值,这样就可以使用"$dialog.json.current.weather"获取天气信息了。

以上是关于如何在自适应对话框 HttpRequest 中从 xml 转换为 json?的主要内容,如果未能解决你的问题,请参考以下文章

DIV+CSS,如何让图片自适应大小?

如何添加CSS让页面自适应手机屏幕

在 SDI mfc 应用程序中从视图访问模式对话框

如何制作一个自适应手机电脑ipad的网页方法总结大全

我应该如何使用 UISplitView 自适应用户界面呈现 UISearchController?

js中怎么使用showModalDialog,弹出一个自适应大小窗口????