我有一个xml,看起来像这样
<person>
<name>
<name-first>foo</name-first>
<name-last>bar</name-last>
</name>
<age>20</age>
<city>nowhere</city>
</person>
我想将其转换为
person:
{
name: {
name-first:'foo',
name-last:'bar'
},
age:'20',
city:'nowhere'
}
提前致谢。
答案 0 :(得分:3)
您想要的是XML到JSON转换器。
答案 1 :(得分:1)
这是一个示例xsl模板,它可以让您了解如何将xml转换为所需的输出:
<xsl:template match="person">
person:
{
name: {
name-first:<xsl:value-of select="name/name-first"/>,
name-last:<xsl:value-of select="name/name-last"/>
},
age:<xsl:value-of select="age"/>,
city:<xsl:value-of select="city"/>
}
</xsl:template>
答案 2 :(得分:1)
有许多通用的XSLT解决方案可用于将XML转换为JSON输出。
例如:
我通过 xml2json-xslt's xml2json.xslt
运行了您的XML并生成了以下JSON输出:
{
"person":
{
"name":
{
"name-first":"foo",
"name-last":"bar"
},
"age":20,
"city":"nowhere"
}
}
答案 3 :(得分:1)
这是一个简单的转换 - 开始:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>
<xsl:param name="pIndents" select="' '"/>
<xsl:template match="*[*]">
<xsl:param name="pcurrentIndents" select="''"/>
<xsl:value-of select="concat($pcurrentIndents, name(), ':')"/>
<xsl:value-of select="concat('
',$pcurrentIndents, '{')"/>
<xsl:apply-templates>
<xsl:with-param name="pcurrentIndents" select=
"concat($pcurrentIndents, $pIndents)"/>
</xsl:apply-templates>
<xsl:value-of select="concat('
',$pcurrentIndents, '}')"/>
</xsl:template>
<xsl:template match="*[not(*)]">
<xsl:param name="pcurrentIndents" select="''"/>
<xsl:text>
</xsl:text>
<xsl:value-of select="concat($pcurrentIndents, name(), ':')"/>
<xsl:apply-templates/>
</xsl:template>
</xsl:stylesheet>
将此转换应用于提供的XML文档:
<person>
<name>
<name-first>foo</name-first>
<name-last>bar</name-last>
</name>
<age>20</age>
<city>nowhere</city>
</person>
产生了想要的正确结果:
person:
{ name:
{
name-first:foo
name-last:bar
}
age:20
city:nowhere
}
<强>解释强>:
有两个匹配元素的模板。
匹配*[*]
的模板匹配具有子元素的元素。它使用name()
函数生成当前匹配元素的名称,然后是:
字符,然后是NL字符,当前缩进(空格数),最后是{
字符。然后将模板应用于当前匹配元素的子节点,并使用$pcurrentIndents
参数传递当前缩进,并使用预定义的空格字符增量(在全局参数$pIndents
中指定)最后,在新行和使用当前缩进,结束大括号是putput。
匹配*[not(*)]
的模板(没有任何元素作为子元素的元素)类似,但更简单。它输出当前缩进处的匹配元素的名称和:
字符。这里应用模板为非元素节点调用XSLT内置模板 - 在这种情况下,选择与文本节点匹配的内置模板,它只是将文本节点复制到输出。