简体   繁体   English

wso2 将 xml 转换为 json 与数组

[英]wso2 convert xml to json with array

I am trying to convert xml to json using an xslt.我正在尝试使用 xslt 将 xml 转换为 json。 When I have single node, the JSON output does not contain an array, but when it has multiple nodes it will show up as an array当我有单个节点时,JSON output 不包含数组,但是当它有多个节点时,它将显示为数组

If I have single Report Entry then JSON output is as follows (missing the array):如果我有单个报告条目,则 JSON output 如下(缺少数组):

XML: XML:

<Report_Data>
    <Report_Entry>
        <ID>0025440</ID>
    </Report_Entry>
</Report_Data>

Results:结果:

{
    "Report_Data": {
        "Report_Entry": 
            {  "ID": "0025440" }
    }
}

When I have multiple entry in XML then the output is as follows (array exists):当我在 XML 中有多个条目时,output 如下(存在数组):

XML: XML:

<Report_Data>
    <Report_Entry>
        <ID>0025440</ID>
    </Report_Entry>
    <Report_Entry>
        <ID>00254401</ID>
    </Report_Entry>
</Report_Data>

Results:结果:

{
    "Report_Data": {
        "Report_Entry": [
            { "ID": "0025440" },
            { "ID": "0025441" }
        ]
    }
}

This is a sample Input XML File Trying to Add Arrays in WSo2.这是一个示例输入 XML 文件试图在 WSo2 中添加 Arrays。 This fails to add arays in JSON output.这无法在 JSON output 中添加数组。

a345ea1b59d c867b9511fa201 a345ea1b59d c867b9511fa201

CCH2 c867b9511fa201 c867b9511fa201 5005854 CCH2 c867b9511fa201 c867b9511fa201 5005854

 <xyz:AStatus xyz:Descriptor="Pending"> <xyz:ID xyz:type="ID">5e3ae98c7e4b4af9836cd</xyz:ID> <xyz:ID xyz:type="DID">PENDING</xyz:ID> </xyz:AStatus> <xyz:Net>0</xyz:Net> <xyz:AMoment>2019-10-10</xyz:AMoment> </xyz:Report_Entry> </xyz:Report_Data> </env:Body> </env:Envelope> </xyz:Body> </xyz:Envelope>

This is formatted properly with out any issues since it has multiple Report Entrys:由于它有多个报告条目,因此格式正确,没有任何问题:

a345ea1b59d c867b9511fa201 a345ea1b59d c867b9511fa201

CCH2 c867b9511fa201 c867b9511fa201 5005854 CCH2 c867b9511fa201 c867b9511fa201 5005854

 <xyz:AStatus xyz:Descriptor="Pending"> <xyz:ID xyz:type="ID">5e3ae98c7e4b4af9836cd</xyz:ID> <xyz:ID xyz:type="DID">PENDING</xyz:ID> </xyz:AStatus> <xyz:Net>0</xyz:Net> <xyz:AMoment>2019-10-10</xyz:AMoment> </xyz:Report_Entry> <xyz:Report_Entry> <xyz:BusinessAsset xyz:Descriptor="12"> <xyz:ID xyz:type="ID">a345ea1b59d</xyz:ID> </xyz:BusinessAsset> <xyz:CH xyz:Descriptor="UCCH2"> <xyz:ID xyz:type="ID">c867b9511fa201</xyz:ID> <xyz:ID xyz:type="OID" >CCH2</xyz:ID> <xyz:ID xyz:type="CID" >CCH2</xyz:ID> </xyz:CH> <xyz:CH xyz:Descriptor="UCCH3"> <xyz:ID xyz:type="ID">c867b9511fa201</xyz:ID> <xyz:ID xyz:type="OID" >CCH3</xyz:ID> <xyz:ID xyz:type="CID" >CCH3</xyz:ID> </xyz:CH> <xyz:CH xyz:Descriptor="UCCH4"> <xyz:ID xyz:type="ID">c867b9511fa201</xyz:ID> <xyz:ID xyz:type="OID" >CCH4</xyz:ID> <xyz:ID xyz:type="CID" >CCH4</xyz:ID> </xyz:CH> <xyz:AID>5005854</xyz:AID> <xyz:AStatus xyz:Descriptor="Pending"> <xyz:ID xyz:type="ID">5e3ae98c7e4b4af9836cd</xyz:ID> <xyz:ID xyz:type="DID">PENDING</xyz:ID> </xyz:AStatus> <xyz:Net>0</xyz:Net> <xyz:AMoment>2019-10-10</xyz:AMoment> </xyz:Report_Entry> </xyz:Report_Data> </env:Body> </env:Envelope> </xyz:Body> </xyz:Envelope>

If you want to present 'Report_Entry' as a JSON array, regardless of it has one or many elements, this needs to be done inside the XSLT file and need to include below XML processing instruction.如果要将'Report_Entry'显示为JSON数组,无论它有一个还是多个元素,都需要在XSLT文件中完成,并且需要在下面包含Z3501BB093D363810B671059B9CF处理指令。

<xsl:processing-instruction name="xml-multiple">Report_Entry</xsl:processing-instruction>

You can try this:你可以试试这个:

    <?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">
    <xsl:output method="text" omit-xml-declaration="yes" indent="yes"/>
    <xsl:template match="Report_Data">
        <xsl:text>{</xsl:text>
        <xsl:text>&#x0A;</xsl:text>
        <xsl:text>&#x2003;"</xsl:text><xsl:value-of select="local-name()"/><xsl:text>":</xsl:text>
        <xsl:for-each select="Report_Entry">
            <xsl:text>{</xsl:text><xsl:text>&#x0A;</xsl:text>
            <xsl:text>&#x2003;&#x2003;"</xsl:text><xsl:value-of select="local-name()"/><xsl:text>":</xsl:text>
            <xsl:for-each select="ID">
                <xsl:if test="following-sibling::* and position()=1">[&#x0A;</xsl:if>
                <xsl:if test="not(following-sibling::*) and position()=1"><xsl:text>&#x0A;</xsl:text></xsl:if>
                <xsl:text>&#x2003;&#x2003;&#x2003;{</xsl:text><xsl:text>"</xsl:text><xsl:value-of select="local-name()"/><xsl:text>": </xsl:text><xsl:value-of select="concat('&quot;',.,'&quot;')"/><xsl:text>}</xsl:text><xsl:text>&#x0A;</xsl:text>
                <xsl:if test="preceding-sibling::* and position()=last()">&#x2003;&#x2003;]&#x0A;</xsl:if>
            </xsl:for-each>
            <xsl:text>&#x2003;}</xsl:text><xsl:text>&#x0A;</xsl:text>
        </xsl:for-each>
        <xsl:text>}</xsl:text>
    </xsl:template>
</xsl:stylesheet>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM