转换XML => JSON =>基于XSD架构的XML

时间:2017-10-31 09:13:53

标签: java json xml xsd

我在这个主题上看到了很多线索,但没有一个回答。 实际上是否有可以进行转换的JAVA库XML => JSON => XML使用XSD Schema来更好地处理XML中单个元素的问题。

(XML中的单个元素可以是数组,也可以是单个对象,具体取决于XSD架构)

XML示例:

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

JSON可以是:

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

或任何带对象而不是数组的东西:

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

但是使用XSD,我们可以从maxoccurs参数知道root是唯一的,person是一个数组,名称是唯一的,所以好的转换将是:

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

提前谢谢

1 个答案:

答案 0 :(得分: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"}]