【问题标题】:Conversion XML => JSON => XML based on a XSD Schema转换 XML => JSON => 基于 XSD Schema 的 XML
【发布时间】:2017-10-31 09:13:53
【问题描述】:

我看到了很多关于这个主题的主题,但没有一个有答案。 实际上是否有一个 JAVA 库可以使用 XSD Schema 进行转换 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 以说明您的意思。
  • 我希望现在更清楚,问题是确定 XML 中的唯一元素是否必须表示为数组或 JSON 中的对象,以及为什么我找不到任何 JAVA 库处理使用 XML 文档的 XSD 解决此问题
  • 您发布的带有数组的 JSON 无效,数组中没有 key : value 对,只有用逗号分隔的值。
  • 对于一种适合所有人的解决方案的要求有太多变化。 Schema 知识可以提供帮助,但只是在一定程度上:例如,它不能告诉您(除非通过有根据的猜测)一个元素中子项的顺序是否重要。这就是为什么在 XSLT 3.0 中,我们决定提供允许您滚动自己的转换的机制,而不是试图猜测您的确切要求。

标签: java json xml xsd


【解决方案1】:

如果您使用的是 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;
  }
}

它将返回一个JacksonObjectNode,带有以下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"}]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-02
    • 2016-07-09
    • 1970-01-01
    • 2019-12-17
    • 2017-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多