将 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的主要内容,如果未能解决你的问题,请参考以下文章