将 XML 数据解析为 JSON

Posted

技术标签:

【中文标题】将 XML 数据解析为 JSON【英文标题】:Parse XML data to JSON 【发布时间】:2015-06-30 19:51:38 【问题描述】:

在我们的环境中,我们使用带有存储过程的 MS SQL。在这些过程中,我们以 XML 形式返回结果,并在需要时访问数据。

我在我们的工具中引入了一些图表,这些图表是第 3 方,需要特定格式才能运行,但我遇到了问题。

在此屏幕截图中,您可以看到结构应该是什么样子,我可以很好地使用该插件。问题在于 SimpleXML 如何处理单个结果集。

如下图所示,对于一个结果项,它不再被格式化为数组。问题是插件希望找到第一个示例中格式的数据,但是当只有一个值时,它不会将其存储为数组。

从这张图片可以看出,escalationTypes 的数据集是数组格式,而下面的 submittedByDepartment 不是。

我正在尝试找出是否可以使用 SimpleXML 解决此问题的根源。这是在 SimpleXML 中发现的常见问题并有解决方法吗?

更新

这是我正在使用的 XML 对象的示例:http://pastebin.com/uPh0m3qX

【问题讨论】:

如果您包含一些示例数据作为文本,而不仅仅是屏幕截图,这个问题会更容易阅读(并且更容易在答案中包含详细信息)。 link 这个答案可能会有所帮助。 感谢@BobNocraz - 我在函数中添加了,但它似乎根本没有改变数组 @BobNocraz 该帖子上的答案主要使用转换为 JSON 作为获取 php 数组的技巧。在这个问题中,JSON 已经是目标,因此通过 JSON 没有帮助。 阅读该答案的 cmets,他们似乎提供了进一步的见解。 【参考方案1】:

我不是 100% 清楚您所需的结构是什么,但总的来说,直接从 XML 跳转到 JSON 或反之亦然不是一个好主意。两者都可以以多种方式表示数据,而您真正想要的是从中提取数据并将其转换为另一种。

请注意,这就是 SimpleXML 旨在帮助您解决的问题 - 它从不包含任何数组,但它为您提供了一个 API 帮助您提取所需的数据.

如果我理解正确,您想从每个 dataset 元素构建一个数组,并将它们放入您的 JSON 中,所以您需要这样的东西:

foreach ( $xml->children() as $item_name => $item ) 
      foreach ( $item->dataset as $dataset ) 
             $json[$item_name]['dataset'] = (array)$dataset->attributes();
       

请注意,如果只有一项要循环,则这些循环的行为都不会有所不同。 SimpleXML 根据您如何使用它而不是根据 XML 的外观来决定是像数组还是像对象一样工作。

请注意,虽然您可以构建一个更通用的 XML 到数组(或 XML 到 JSON)函数,但让它始终从任何输入中提供所需的输出可能需要更多时间,并导致代码更难调试,而不是像上面那样编写特定的代码。

【讨论】:

感谢@IMSoP 的回答 - 我只能使用从查询返回的初始 XML 字符串。有了SimpleXML,我可以随心所欲地使用它,但在它实际创建之前什么也做不了。发生的情况是用户在 UI 中选择过滤器选项。然后它对这些选项运行查询并返回直接从 XML 中 json_encoded 并写入文件的结果。然后页面上的多个图表会读取该文件。 @SBB 我不确定您的评论与我的回答有何关联。我给出的示例方法在创建 SimpleXML 对象之前不需要做任何事情,它只是使用该对象的方法来构建您选择的数组结构,您可以将其传递给 json_encode 以供小部件使用。如果有什么不清楚的地方请告诉我。 我想我有点不清楚如何实现这一点。我将$xml 更改为$data,因为这是存储查询结果的内容,但是当我尝试转储$json 时,我没有得到任何返回。我实际上让它打印出数据,但似乎每个循环的内部可能需要一些工作 - oi58.tinypic.com/34zf6yr.jpg @SBB 正如我上面提到的,只有屏幕截图,没有实际 XML 和 JSON 的示例,很难给出与您的情况完全匹配的示例。您可能想查看手册中的基本用法示例以了解发生了什么:php.net/manual/en/simplexml.examples-basic.php 最好构建查看 XML 本身的逻辑,因为 print_r 和 SimpleXML 有时会有点误导。跨度> @SBB 不,那不是 XML,那是 print_r 的结果。我不能用它来创建示例代码。另外,这是理解 SimpleXML 的关键,没有数组; print_r 必须向您显示有多个具有相同名称的节点,因此它的布局是这样的,但是如果您像我在示例中所做的那样使用循环,它对一个孩子的工作效果与对许多。再次,查看手册中的示例。【参考方案2】:

您可以通过在引用变量之前添加 (array) 来将对象声明为数组。 (array)$wasobject

【讨论】:

我正在从数据库查询的结果中生成这个数组。发生的一切都是$this->results = new SimpleXMLElement($xml);,所以我无法访问它自己的结构,以便能够在我需要的结构之前添加它。

以上是关于将 XML 数据解析为 JSON的主要内容,如果未能解决你的问题,请参考以下文章

从 Axios 响应中解析 XML,推送到 Vue 数据数组

在 Node.js 中解析大型 XML 文件

在 iOS 中解析 JSON 与解析 XML

json数据解析与xml数据解析

解析 JSON 文件数据后,在结果 XML 中添加注释

C# 解析 Json数据