【问题标题】:Need to convert XML to JSON in @ and # format using JAVA only只需要使用 JAVA 将 XML 转换为 @ 和 # 格式的 JSON
【发布时间】:2015-12-22 02:50:22
【问题描述】:

我想按照以下示例将 xml 转换为 json: 示例 XML:

    <Details>
         <Records>
           <name id='123'>xyz</name>
           <age>25</age>
           <gender type='male' />
          </Records>
    </Details>

预期的 JSON 输出:

{
  "Details": {
    "Records": {
      "name": {
        "@id": "123",
        "#text": "xyz"
      },
      "age": "25",
      "gender": { 
        "@type": "male" 
       }
    }
  }
}

请帮帮我。

【问题讨论】:

  • 你试过什么?您想使用什么工具/库?你的问题现在太不具体了——有很多方法可以做到这一点。
  • 请按照以下网址,[Convert XMl to JsonObject using Javascript,Jquery][1] [1]: stackoverflow.com/questions/20679135/…
  • 没有。我需要从头开始构建它。我没有代码。需要知道这样做的方法。
  • 请点击此链接 [Convert XMl to JsonObject using Javascript,Jquery][1] [1]: stackoverflow.com/questions/20679135/…

标签: java json xml transform


【解决方案1】:

如果你使用的是 Java 8,你应该看看我的unXml-library。它是开源的,可在 Maven Central 上获取。

此代码适用于您的项目

import com.nerdforge.unxml.Parsing;
import com.nerdforge.unxml.factory.ParsingFactory;
import org.w3c.dom.Document;
import java.util.List;

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

        Parser<ObjectNode> parser = parsing.obj("Details")
            .attribute("Records", parsing.obj("Records")
                .attribute("name", parsing.obj("name")
                    .attribute("@id", "@id")
                    .attribute("#text", "text()")
                )
                .attribute("age", "age")
                .attribute("gender", parsing.obj("gender")
                    .attribute("@type", "@type")
                )
            )
            .build();

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

请注意,这个库的重点是使用 Xpath 从 XML 中提取值,并将它们分配给 Json 对象中的属性。所以你可以创建“更好”的 Json,它不受 xml 结构的约束。

例子

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

        Parser<ArrayNode> parser = parsing.arr("//Records", parsing.obj()
            .attribute("id", "name/@id", parsing.number())
            .attribute("name") // name is both the xpath, and json-attribute key
            .attribute("age", "age", parsing.number())
            .attribute("gender", "gender/@type")
        ).build();

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

会返回json

[{
    id: 123,
    name: "xyz",
    age: 25,
    gender: "male" 
}]

使用parsing.arr("&lt;xpath&gt;", ...) 创建数组。

【讨论】:

  • 这只有在我知道 xml 结构来找我的情况下才有效。但 XML 标记可能会有所不同。
  • @ShayanSingla 没错。您必须提前知道您的 xml 结构才能使用unXml
  • @ShayanSingla 我的用例经常涉及稍后在基于 JS 的 Web 应用程序中使用 Json。尽可能简化服务器端的模型被认为是一种很好的做法,以便客户端 JavaScript 可以尽可能简单。 JS 代码也(通常)需要一个定义良好的对象(或对象数组)。
【解决方案2】:

创建数据的类表示。然后使用像 Jackson 这样理解 JSON 和 XML 的对象映射器。从 XML 反序列化并序列化为 JSON。

【讨论】:

  • 我需要让它成为一个可以处理任何模式的通用函数。
  • Jackson 是一个通用的映射工具。但是您需要定义一个类来充当 XML 和 JSON 之间的通用数据模型,用于描述您想要的输出形状。该类可以像 Map 一样通用,但如果没有适当的定义,您将无法获得所需的具体结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多