如何创建在转换为 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