【问题标题】:Convert a raw XML string into a list of java objects?将原始 XML 字符串转换为 java 对象列表?
【发布时间】:2017-09-02 03:58:10
【问题描述】:

好的 - 我知道这应该很容易 - 但由于某种原因 - 我无法让它工作!

假设我有以下 POJO:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement
public class PlainOldJavaObject implements Serializable {

    private long uuid;
    private String name;

    public PlainOldJavaObject() {
    }

    public long getUuid() {
        return this.uuid;
    }

    public void setUuid(long uuid) {
        this.uuid = uuid;
    }

    public String getNamen() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }

    /* Omitted HashCode & Equals for brevity. */
}

假设我有以下 xml(为了便于阅读,我已对其进行了格式化 - 实际上我将其作为原始的、未格式化的字符串获取):

<PlainOldJavaObjects>
    <PlainOldJavaObject>
        <uuid>8119</uuid>
        <name>Jimmy</name>
    </PlainOldJavaObject>
    <PlainOldJavaObject>
        <uuid>2372</uuid>
        <name>Johns</name>
    </PlainOldJavaObject>
</PlainOldJavaObjects>

我到底如何将 XML 转换为 List 实例?

我尝试使用 XStream - 如下:

XStream xStream = new XStream();
List<PlainOldJavaObject> endResultHopefully = (List<PlainOldJavaObject>) xStream.fromXML(result);

但似乎所做的只是将以下内容打印到我的终端...

PlainOldJavaObjects : PlainOldJavaObjects

我到底做错了什么?

注意:添加 JAXB 标记是因为通过谷歌搜索 - 我看到它存在,并且我认为它可能是我想要的 - 但我不确定,也许社区中的某个人也可能对我有一些指导?

【问题讨论】:

  • 使用 jaxb。这就是它的作用。
  • 我似乎找不到将 jaxb 用于列表的示例,而无需编写列表所在的包装类。这不是我能够为这个项目带来改变的东西。
  • jaxb 模型是将每个元素(实际上是复杂类型)映射到一个 Java 类,这就是您的“PlainOldJavaObjects”元素需要一个类的原因。在我看来,使用 jaxb 的最佳方式是将其从 XSD 中移除,并在编译时生成所有 pojo(带有所有必要的注释)。需要维护的代码要少得多,而且代码模式很容易习惯。如果您使用 XML,Jaxb 绝对是您的必经之路 - 不知道如何说服“强大的力量”……祝您好运。
  • 在任何情况下,您都需要一个顶级包装类 PlainOldJavaObjects 来保存对象集合,不仅在使用 JAXB 时,在使用 XStream 时也是如此。

标签: java xml jaxb unmarshalling xstream


【解决方案1】:

使用 XStream 并将您的类包装在包含使用 @XStreamImplicit 的 PlainOldJavaObject 列表的 PlainOldJavaObjects 类中。 这是一个例子。首先,为您的 PlainOldJavaObject 类添加注释

@XStreamAlias("PlainOldJavaObject")
public class PlainOldJavaObject implements Serializable
{

    private long uuid;
    private String name;


    public PlainOldJavaObject()
    {
    }


    public long getUuid()
    {
        return this.uuid;
    }

    public void setUuid(long uuid)
    {
        this.uuid = uuid;
    }

    public String getNamen()
    {
        return this.name;
    }

    public void setName(String name)
    {
        this.name = name;
    }
}

将@XStreamImplicit 添加到PlainOldJavaObject 列表中

@XStreamAlias("PlainOldJavaObjects")
public class PlainOldJavaObjects
{

    @XStreamImplicit
   private List<PlainOldJavaObject> pojoList = new 
ArrayList<PlainOldJavaObject>();

    public void addPojo(final PlainOldJavaObject pojo)
    {
        pojoList.add(pojo);
    }

    public List<PlainOldJavaObject> getList()
    {
        return pojoList;
    }
}

类来测试结果。首先将生成的 xml 写入字符串。然后使用字符串创建您需要的列表。

public class TestXML
{

    @Test
    public void testXML()
    {
        PlainOldJavaObjects pojos = new PlainOldJavaObjects();

        PlainOldJavaObject pojo = new PlainOldJavaObject();

        pojo.setName("Jimmy");
        pojo.setUuid(8119);

        pojos.addPojo(pojo);

        PlainOldJavaObject pojo2 = new PlainOldJavaObject();
        pojo2.setName("Johns");
        pojo2.setUuid(2372);

        pojos.addPojo(pojo2);

        XStream xstream = new XStream();
        xstream.processAnnotations(PlainOldJavaObjects.class);
        xstream.processAnnotations(PlainOldJavaObject.class);

        String xml = xstream.toXML(pojos);
        System.out.println(xml);

        PlainOldJavaObjects pojos2 = (PlainOldJavaObjects) 
 xstream.fromXML(xml);

        // list with two PlainOldJavaObject
        assertEquals(2, pojos2.getList().size());
    }
}

xml 输出:

<PlainOldJavaObjects>
  <PlainOldJavaObject>
    <uuid>8119</uuid>
    <name>Jimmy</name>
  </PlainOldJavaObject>
  <PlainOldJavaObject>
    <uuid>2372</uuid>
    <name>Johns</name>
  </PlainOldJavaObject>
</PlainOldJavaObjects>

【讨论】:

    猜你喜欢
    • 2017-11-10
    • 2015-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-17
    • 1970-01-01
    • 2019-04-10
    • 1970-01-01
    相关资源
    最近更新 更多