2

我从我的数据库中转储了一些 XML 数据,我需要将其重新格式化为 JSON。我使用的是 IBM DataPower 数据库,因此我实际上需要将该 XML 转换为JSONx,然后使用 IBM 的默认转换器,它会自动将 JSONx 转换为 JSON。

我在定义 JSONx 数组的元素时遇到了困难。这是我目前正在尝试的:

XML

<sql result="success">
    <row>
        <column>
            <name>Prod</name>
            <value>Acura</value>
        </column>
        <column>
            <name>Color</name>
            <value>SILVER</value>
        </column>
        <column>
            <name>Prod</name>
            <value>Accord</value>
        </column>
        <column>
            <name>Color</name>
            <value>Gold</value>
        </column>
    </row>
</sql>


所需的 JSON 输出

{"Category" : [
    {“prod”: “Acura”, "Color" : “Silver”},
    {“prod”: “Accord”, "Color" : “Gold”}
    ],
    "Status" : “Success”
    }

我遇到的问题是我无法获得prodcolor成为同一个 JSON 对象的一部分。相反,我得到这样的输出:

{"Category": [{
    "ID":    [
        ": Acura",
        ": Accord"
        ],
    "NAME":    [
        ": SILVER",
        ": Gold"
        ]
}]}

这是我正在使用的生成有问题的 JSON 的 JSONx 代码:

<json:object
    xsi:schemaLocation="http://www.datapower.com/schemas/json jsonx.xsd"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:json="http://www.ibm.com/xmlns/prod/2009/jsonx">
    <json:array name="Category">
        <json:object>
            <xsl:for-each select="//column">
                <xsl:variable name="colName" select="name" />
                <xsl:if test="$colName = 'Prod'">
                    <json:string name="Prod">:
                        <xsl:value-of select="value" />
                    </json:string>
                </xsl:if>
                <xsl:if test="$colName = 'Color'">
                    <json:string name="Color">:
                        <xsl:value-of select="value" />
                    </json:string>
                </xsl:if>
            </xsl:for-each>
        </json:object>
    </json:array>
</json:object>

我可以说<xsl:for-each>标签正在经历一个条件并在循环中创建一个 JSON 对象,但我不明白如何在它获取 和 的值后创建JSON 对象。如何确保正确解析这些值?colorprod

4

2 回答 2

2

嗨,我得到了答案,我尝试了多种可能性,这是其中一种可能性,我会得到我在那个问题中提到的输出

<json:object xsi:schemaLocation="http://www.datapower.com/schemas/json jsonx.xsd"
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xmlns:json="http://www.ibm.com/xmlns/prod/2009/jsonx">
    <json:array name="Categories">

<xsl:for-each select="sql/row">
<json:object>
<xsl:for-each select="column">
<xsl:variable name="colName" select="name" />
<xsl:choose>
<xsl:when test="$colName = 'PROD ">
<json:string name="name">  <xsl:value-of select="value"/></json:string>
</xsl:when>
<xsl:when test="$colName = 'NAME'">
<json:string name="ID">  <xsl:value-of select="value"/></json:string>
</xsl:when>
</xsl:choose>
</xsl:for-each>
</json:object>
</xsl:for-each>
</json:array>
   </json:object> 

输出

{"Categories": [
      {
      "prod": "Acura",
      "color": "SILVER"
   },
      {
      "prod": "Accord",
      "color": "Gold"
   }
]}
于 2012-10-30T23:40:31.030 回答
0

您必须在database to xml解析上做更多工作,才能获得这样的 xml:

<product-list>
    <product>
        <name>Acura</name>
        <color>SILVER</color>
    </product>
    <product>
        <name>Accord</name>
        <color>Gold</color>
    </product>
</product-list>

这种方式将更容易根据需要进行解析。

你展示的xml,也许可以做到这一点,但它会让你变得不合理的复杂性......我认为

编辑:我的编程环境还没有为这样的事情做好准备......所以让我知道结果

<json:object xsi:schemaLocation="http://www.datapower.com/schemas/json jsonx.xsd"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:json="http://www.ibm.com/xmlns/prod/2009/jsonx">
    <json:array name="Category">
        <xsl:for-each select="product">
            <json:object>
                <json:string name="prod"><xsl:value-of select="name"/></json:string>
                <json:string name="Color"><xsl:value-of select="color"/></json:string>
            </json:object>
        <xsl:for-each>
    <json:array>
</json:object>

或者这样

<json:object xsi:schemaLocation="http://www.datapower.com/schemas/json jsonx.xsd"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:json="http://www.ibm.com/xmlns/prod/2009/jsonx">
    <json:array name="Category">
        <xsl:for-each select="product">
            <xsl:text>{<xsl:text>
                <json:string name="prod"><xsl:value-of select="name"/></json:string>
                <json:string name="Color"><xsl:value-of select="color"/></json:string>
            <xsl:text>}<xsl:text>
        <xsl:for-each>
    <json:array>
</json:object>

我认为第一个很好......如果对象需要名称,请选择最后一个。

于 2012-10-30T18:41:40.677 回答