基于XSD模式的XML => JSON => XML转换

3

我看到许多关于这个主题的帖子,但没有一个有答案。

是否真的有一个JAVA库可以使用XSD架构进行XML => JSON => XML转换,以更好地处理XML中单个元素的问题。

(XML中的单个元素可以是数组或单个对象,具体取决于XSD模式)

XML示例:

    <root><person><name>test</name></person></root>

JSON可以用于:

    {"root": [{"person": [{"name": "test"}]}]}

或者任何使用对象而不是数组的内容:

    {"root": {"person": {"name": "test"}}}

但是使用XSD,我们可以从maxoccurs参数中了解到root是唯一的,person是一个数组,name是唯一的。因此,良好的转换应该是:
    {"root": {"person": 
        [{"name": "foofdo"}]
    }}

提前感谢


你能详细解释一下你所说的“XML中单个元素的问题”到底是什么吗?因为这个问题不太清楚。请提供XML和JSON的实际例子来说明你的意思。 - Jesper
希望现在更清楚了,问题是要确定XML中的唯一元素在JSON中是应该表示为数组还是对象,以及为什么我找不到使用XML文档的XSD处理此问题的JAVA库。 - Robin Camus
你发布的带有数组的JSON是无效的,在一个数组中没有key : value对,只有逗号分隔的值。 - Jesper
1
对于一个解决方案来说,需求的变化太多了,无法适应所有人。模式知识可以帮助一些,但只能到一定程度:例如,它不能告诉你(除非通过做出有根据的猜测)元素内子元素的顺序是否重要。这就是为什么在 XSLT 3.0 中,我们决定提供机制,允许您自己编写转换,而不是试图猜测您的确切要求。 - Michael Kay
1个回答

0
如果您正在使用Java 8或更高版本,您应该查看我的开源库:unXml。unXml基本上将Xpath映射到Json属性。
它可以在Maven Central上获得。
示例
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.nerdforge.unxml.factory.ParsingFactory;
import com.nerdforge.unxml.parsers.Parser;
import org.w3c.dom.Document;

public class Parser {
  public ObjectNode parseXml(String xml){
    Parsing parsing = ParsingFactory.getInstance().create();
    Document document = parsing.xml().document(xml);

    Parser<ObjectNode> parser = parsing.obj("/root/person")
        .attribute("name")
        .build();

    ObjectNode result = parser.apply(document);
    return result;
  }
}

它将返回一个Jackson ObjectNode,其中包含以下json:
{"name":"test"}

数组示例

如果您有多个 person,您可以让它返回一个Jackson ArrayNode

import com.fasterxml.jackson.databind.node.ArrayNode;
import com.nerdforge.unxml.factory.ParsingFactory;
import com.nerdforge.unxml.parsers.Parser;
import org.w3c.dom.Document;

public class Parser {
  public ArrayNode parseXml(String xml){
    Parsing parsing = ParsingFactory.getInstance().create();
    Document document = parsing.xml().document(xml);

    Parser<ArrayNode> parser = parsing.arr("/root/person")
        .attribute("name")
        .build();

    ArrayNode result = parser.apply(document);
    return result;
  }
}

这将为您的输入创建以下JSON:
[{"name":"test"}]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接