gpt4 book ai didi

java - 将 JSON 文件转换为特定的 XML 格式

转载 作者:行者123 更新时间:2023-12-02 02:16:22 27 4
gpt4 key购买 nike

问题

我正在解决一个问题,需要获取 JSON 输入文件并将其转换为 XML 文件。我在下面提供了一个示例来说明我正在处理的问题。

在 JSON 中:

"playerStats": [
{ "jerseyNumber": "23", "fgPercentage": 60, "plusMinus": "plus" },
{ "jerseyNumber": "24", "fgPercentage": 40, "plusMinus": "minus" }
] }

在 XML 中:

<BallerStats>
<BallerStat>
<Baller><BallerJersey>23</BallerJersey><Type>Jersey</Type></Baller>
<fgPercentage><Type>PERCENT</Type><Value>60</Value></fgPercentage>
</BallerStat>
<BallerStat>
<Baller><BallerJersey>23</BallerJersey><Type>Jersey</Type></Baller>
<fgPercentage><Type>PERCENT</Type><Value>60</Value></fgPercentage>
</BallerStat>
</BallerStats>

正如您所看到的,它不是 1 比 1 的比率,在 JSON 中我们将 fgPercentage 表示为 60,但在 xml 中我们用“值”和“类型”将其分开

某些标签名称也不同。在 JSON 中,我们将其称为“playerStats”,在 XML 中,我们将等效标签称为“BallerStats”

解决方案

请记住,除了球员统计数据(例如教练统计数据或球迷统计数据)之外,JSON 文件还可以包含许多其他字段,但我们只关心球员统计数据

以下是我的想法,但我可能还是错的。

  1. 扫描 Json 并查找“playerStats”
  2. 如果没有找到,则不执行任何操作。
  3. 如果找到,则获取有值(value)的信息,例如 jerseyNumber 、 fgPercentage ,忽略 plusMinus 并将它们存储在具有这些值的模板类的对象中。
  4. 然后使用该对象生成适当的 XML 标记。

我不确定我的方法是否有效或高效。我很乐意听到建议,并且我正在使用 Java 进行此操作,因此请随意引用任何可靠且流行的库。我很乐意看到所有方法,如果您提供代码片段就更好了。

最佳答案

一种选择是使用 json-to-xml()在 XSLT 3.0 中。

您需要一个 XSLT 3.0 处理器;我用过Saxon-HE 9.8在我下面的例子中。

您可以将 JSON 作为参数传递。

json-to-xml() 的结果将如下所示:

<map xmlns="http://www.w3.org/2005/xpath-functions">
<array key="playerStats">
<map>
<string key="jerseyNumber">23</string>
<number key="fgPercentage">60</number>
<string key="plusMinus">plus</string>
</map>
<map>
<string key="jerseyNumber">24</string>
<number key="fgPercentage">40</number>
<string key="plusMinus">minus</string>
</map>
</array>
</map>

您可以处理该 XML 以获得目标 XML。

示例...

Java

package so.test1;

import java.io.File;
import java.io.OutputStream;
import javax.xml.transform.stream.StreamSource;
import net.sf.saxon.s9api.XsltTransformer;
import net.sf.saxon.s9api.Processor;
import net.sf.saxon.s9api.QName;
import net.sf.saxon.s9api.SaxonApiException;
import net.sf.saxon.s9api.Serializer;
import net.sf.saxon.s9api.XdmAtomicValue;
import net.sf.saxon.s9api.XsltCompiler;
import net.sf.saxon.s9api.XsltExecutable;

/**
*
* @author dhaley
*
*/
public class SOTest1 {

public static void main(String[] args) throws SaxonApiException {
final String XSLT_PATH = "src/so/test1/test.xsl";
final String JSON = "{\"playerStats\": [\n" +
" {\"jerseyNumber\": \"23\", \"fgPercentage\": 60, \"plusMinus\": \"plus\"},\n" +
" {\"jerseyNumber\": \"24\", \"fgPercentage\": 40, \"plusMinus\": \"minus\"}\n" +
"]}";

OutputStream outputStream = System.out;
Processor processor = new Processor(false);
Serializer serializer = processor.newSerializer();
serializer.setOutputStream(outputStream);
XsltCompiler compiler = processor.newXsltCompiler();
XsltExecutable executable = compiler.compile(new StreamSource(new File(XSLT_PATH)));
XsltTransformer transformer = executable.load();
transformer.setInitialTemplate(new QName("init")); //<-- SET INITIAL TEMPLATE
transformer.setParameter(new QName("json"), new XdmAtomicValue(JSON)); //<-- PASS JSON IN AS PARAM
transformer.setDestination(serializer);
transformer.transform();
}

}

XSLT 3.0(测试.xsl)

<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xpath-default-namespace="http://www.w3.org/2005/xpath-functions">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:param name="json"/>

<xsl:mode on-no-match="shallow-copy"/>

<xsl:template name="init">
<!--Only process playerStats-->
<xsl:apply-templates select="json-to-xml($json)//array[@key='playerStats']"/>
</xsl:template>

<xsl:template match="array">
<BallerStats>
<xsl:apply-templates/>
</BallerStats>
</xsl:template>

<xsl:template match="map">
<BallerStat>
<xsl:apply-templates/>
</BallerStat>
</xsl:template>

<xsl:template match="*[@key='jerseyNumber']">
<Baller>
<BallerJersey xsl:expand-text="true">{.}</BallerJersey>
<Type>Jersey</Type>
</Baller>
</xsl:template>

<xsl:template match="*[@key='fgPercentage']">
<fgPercentage>
<Type>PERCENT</Type>
<Value xsl:expand-text="true">{.}</Value>
</fgPercentage>
</xsl:template>

<xsl:template match="*[@key=('plusMinus')]"/>

</xsl:stylesheet>

输出(标准输出)

<?xml version="1.0" encoding="UTF-8"?>
<BallerStats>
<BallerStat>
<Baller>
<BallerJersey>23</BallerJersey>
<Type>Jersey</Type>
</Baller>
<fgPercentage>
<Type>PERCENT</Type>
<Value>60</Value>
</fgPercentage>
</BallerStat>
<BallerStat>
<Baller>
<BallerJersey>24</BallerJersey>
<Type>Jersey</Type>
</Baller>
<fgPercentage>
<Type>PERCENT</Type>
<Value>40</Value>
</fgPercentage>
</BallerStat>
</BallerStats>

关于java - 将 JSON 文件转换为特定的 XML 格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49263632/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com