如何创建在转换为 JSON 时始终被解析为数组的 xmlNode
How to create xmlNode which will always be parsed as array when converted into JSON
我有这个简单但棘手的要求。
我的代码派生了一些 xml 形式的源代码,可以是这样的
XML1
<data>
<MyDataCollection>
<mydata>
<m1>dsds</m1>
</mydata>
<mydata>
<m1>dsds</m1>
</mydata>
</MyDataCollection>
</data>
或者这个
XML2
<data>
<MyDataCollection>
<mydata>
<m1>dsds</m1>
</mydata>
</MyDataCollection>
</data>
当我将这两种类型的XML转换为JSON时,
我得到以下 XML1 的输出
JSON1
{
"data": {
"MyDataCollection": {
"mydata": [
{ "m1": "dsds" },
{ "m1": "dsds" }
]
}
}
}
以及 XML2 的以下输出
JSON2
{
"data": {
"MyDataCollection": {
"mydata": { "m1": "dsds" }
}
}
}
当我尝试使用相同的 JSON 模式验证这两个 JSON 时出现问题。
这两个 JSON 的 JSON 模式不同并且抛出
"Expected Array but got Object"
或
"Expected Object but got Array"
取决于它是使用 JSON 和 Array(1st JSON) 还是 JSON 和 Object(2nd JSON)
所以我想要一个在转换为 JSON 时总是将 MyDataCollection
解析为数组的东西,而不管它是否具有一个或多个子元素。
通过在 <MyDataCollection>
中添加虚拟 <mydata>
标记,可以解决此问题,但这不符合我的要求。
是否有任何我可以在 XML 标记中指定的属性,无论何时解析它总是将其解释为数组?
如果您使用 XSLT 3.0 将 XML 转换为 JSON,您可以使用以下样式表:
<xsl:stylesheet version="3.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.w3.org/2005/xpath-functions">
<xsl:output method="text" encoding="UTF-8"/>
<xsl:template match="/data">
<!-- CONVERT INPUT TO XML FOR JSON -->
<xsl:variable name="xml">
<map>
<map key="data">
<map key="MyDataCollection">
<array key="mydata">
<xsl:for-each select="MyDataCollection/mydata">
<map>
<string key="m1">
<xsl:value-of select="m1"/>
</string>
</map>
</xsl:for-each>
</array>
</map>
</map>
</map>
</xsl:variable>
<!-- OUTPUT -->
<xsl:value-of select="xml-to-json($xml)"/>
</xsl:template>
</xsl:stylesheet>
生产:
{"data":{"MyDataCollection":{"mydata":[{"m1":"dsds"},{"m1":"dsds"}]}}}
来自您的 XML1 示例和:
{"data":{"MyDataCollection":{"mydata":[{"m1":"dsds"}]}}}
来自 XML2.
演示 1:https://xsltfiddle.liberty-development.net/6rewNyd
演示 2:https://xsltfiddle.liberty-development.net/6rewNyd/1
我有这个简单但棘手的要求。 我的代码派生了一些 xml 形式的源代码,可以是这样的 XML1
<data>
<MyDataCollection>
<mydata>
<m1>dsds</m1>
</mydata>
<mydata>
<m1>dsds</m1>
</mydata>
</MyDataCollection>
</data>
或者这个 XML2
<data>
<MyDataCollection>
<mydata>
<m1>dsds</m1>
</mydata>
</MyDataCollection>
</data>
当我将这两种类型的XML转换为JSON时, 我得到以下 XML1 的输出 JSON1
{
"data": {
"MyDataCollection": {
"mydata": [
{ "m1": "dsds" },
{ "m1": "dsds" }
]
}
}
}
以及 XML2 的以下输出 JSON2
{
"data": {
"MyDataCollection": {
"mydata": { "m1": "dsds" }
}
}
}
当我尝试使用相同的 JSON 模式验证这两个 JSON 时出现问题。
这两个 JSON 的 JSON 模式不同并且抛出
"Expected Array but got Object"
或
"Expected Object but got Array"
取决于它是使用 JSON 和 Array(1st JSON) 还是 JSON 和 Object(2nd JSON)
所以我想要一个在转换为 JSON 时总是将 MyDataCollection
解析为数组的东西,而不管它是否具有一个或多个子元素。
通过在 <MyDataCollection>
中添加虚拟 <mydata>
标记,可以解决此问题,但这不符合我的要求。
是否有任何我可以在 XML 标记中指定的属性,无论何时解析它总是将其解释为数组?
如果您使用 XSLT 3.0 将 XML 转换为 JSON,您可以使用以下样式表:
<xsl:stylesheet version="3.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.w3.org/2005/xpath-functions">
<xsl:output method="text" encoding="UTF-8"/>
<xsl:template match="/data">
<!-- CONVERT INPUT TO XML FOR JSON -->
<xsl:variable name="xml">
<map>
<map key="data">
<map key="MyDataCollection">
<array key="mydata">
<xsl:for-each select="MyDataCollection/mydata">
<map>
<string key="m1">
<xsl:value-of select="m1"/>
</string>
</map>
</xsl:for-each>
</array>
</map>
</map>
</map>
</xsl:variable>
<!-- OUTPUT -->
<xsl:value-of select="xml-to-json($xml)"/>
</xsl:template>
</xsl:stylesheet>
生产:
{"data":{"MyDataCollection":{"mydata":[{"m1":"dsds"},{"m1":"dsds"}]}}}
来自您的 XML1 示例和:
{"data":{"MyDataCollection":{"mydata":[{"m1":"dsds"}]}}}
来自 XML2.
演示 1:https://xsltfiddle.liberty-development.net/6rewNyd
演示 2:https://xsltfiddle.liberty-development.net/6rewNyd/1