【问题标题】:Hierarchical XML to JSON分层 XML 到 JSON
【发布时间】:2013-06-24 13:47:36
【问题描述】:

我必须显示一个层次结构,我的输入来自像这样的 XML 格式的 Web 服务:

<Nodes>
    <Node>
        <Data>
            <Attribute name="ID">Desktop</Attribute>
            <Attribute name="Parent">administrator</Attribute>
        </Data>
        <Relationship>
            <RelatedNodes>
                <Node>
                    <Data>
                        <Attribute name="ID">administrator</Attribute>>
                        <Attribute name="Parent">Users</Attribute>
                    </Data>
                    <Relationship>
                        <RelatedNodes>
                            <Node>
                                <Data>
                                    <Attribute name="ID">Users</Attribute>
                                    <Attribute name="Parent">C</Attribute>
                                </Data>
                                <Relationship>
                                    <RelatedNodes>
                                        <Node>
                                            <Data>
                                                <Attribute name="ID">C</Attribute>
                                                <Attribute name="Parent"/>
                                            </Data>
                                        </Node>
                                    </RelatedNodes>
                                </Relationship>
                            </Node>
                        </RelatedNodes>
                    </Relationship>
                </Node>
            </RelatedNodes>
        </Relationship>
    </Node>
</Nodes>

为了显示它,UI 人员要求我转换为像这样的 JSON:

{
    children:[{
            "title": "C",
            "level": "1",
            "children": [
                {
                    "title": "Users",
                    "level": "2",
                    "children": [
                        {
                            "title": "administrator",
                            "level": "3",
                        }, 
                        "children": [
                            {
                                "title": "Desktop",
                                "level": "4",
                            },
                        ]
                    ]
                }
            ]
    }]
}

关于如何使用 XSLT 或任何其他转换工具执行此操作的任何想法?

谢谢!

【问题讨论】:

  • 只要搜索 SO,有很多方法可以做到,这里是 Javascript:stackoverflow.com/questions/7769829/…
  • 您的 XML 在语法上无效(请修复它),并且不清楚它与您的示例 JSON 有何关系。例如C 是什么?
  • 感谢 Raffian,我找到了很多将 XML 转换为 JSON 的工具,但是所有这些工具都从字面上转换 xml,我的意思是 xml 的每个元素都是 JSON 中的一个元素。这里的问题是我有一个分层的xml结构,我不知道深,所以我需要去到应该是结构中更深的元素的父元素,然后上到最后一个元素。但是我怎么知道如果我不知道结构的深度,则父的路径。
  • 这是一个具有 Windows 文件夹结构的示例,因此“C”是根文件夹,示例路径为:C:/Users/administrator/Desktop。 JSON 结构使用“children”数组来表示该元素的子元素。
  • 要更正 XML,只需将第 11 行更改为:administrator

标签: xml json xslt


【解决方案1】:

这里有一个小样式表,让您知道如何处理这个问题:

<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform' >
    <xsl:output method='text'  encoding="UTF-8"/>

    <xsl:template match="/">
        {
        <xsl:apply-templates select="//Data[Attribute/@name ='Parent' and Attribute = '' ]/parent::Node" />
        }
    </xsl:template>

    <xsl:template match="Node" >
        <xsl:param name="level" select="1" />
        children:[
        {
        "title": "<xsl:value-of select="Data/Attribute[@name = 'ID']" />",
           "level": "<xsl:value-of select="$level"/>,
           <xsl:apply-templates select="ancestor::Node[1]">
               <xsl:with-param name="level" select="$level+1" />
           </xsl:apply-templates>
        }
        ]

    </xsl:template>
</xsl:stylesheet> 

它从具有名称为“Parent”但没有值的属性的节点开始。

顺便说一句,你的 xml 结构很奇怪,如果结构更复杂(同一级别上有更多节点),我不知道这应该如何工作。

【讨论】:

  • 谢谢你做得很好,我只是将第一个模板中的 xpath 更改为: 它不适用于更复杂的结构。非常感谢!
猜你喜欢
  • 2020-01-01
  • 1970-01-01
  • 2012-03-01
  • 2017-01-08
  • 1970-01-01
  • 1970-01-01
  • 2011-07-23
  • 1970-01-01
相关资源
最近更新 更多