Jackson XmlMapper将XML转换为POJO,节点文本的关键是“”

时间:2012-10-08 04:22:28

标签: java xml groovy jackson pojo

我正在尝试从服务中读取XML数据(我无法更改数据)并且遇到Jackson XmlMapper的问题。如果我有这样的XML:

<entry>
   <title type="text">W411638</title>
</entry>

它给了我以下地图:

title: ["": "W411638", "type": text]

我正在尝试使用以下代码将其转换为对象:

XmlMapper xmlMapper = new XmlMapper()
Entry entry = xmlMapper.readValue(xmlData, Entry.class)

我的入门课程看起来像这样:

class Entry {
    static class Title {
        //String __;  //-- This is what I can't figure out --
        String type; 
    }

    Title title;
}

问题是我无法找到任何方法将标题文本(“W411638”)放入条目对象中。类型拉得很好,我可以通过entry.title.type得到它,它是正确的,我只是不知道如何获得该标题值。

2 个答案:

答案 0 :(得分:2)

这对我来说是一个独立的Groovy脚本......

@Grab( 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.0.5' )
import com.fasterxml.jackson.dataformat.xml.XmlMapper
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlText

class Entry {
  static class Title {
    public String type

    @JacksonXmlText
    public String value

    public String toString() {
      "$type -> $value"
    }
  }

  public Title title

  public String toString() {
    "Entry [$title]"
  }
}

def xml = '''<entry>
            |    <title type="text">W411638</title>
            |</entry>'''.stripMargin()

def xmlMapper = new XmlMapper()
Entry pojo = xmlMapper.readValue( xml, Entry )

println pojo // prints 'Entry [text -> W411638]'

手指越过它也适合你!

答案 1 :(得分:2)

我能够使用@JSONCreator来解决这个问题;

XML

<x>
    <a b="c" d="e">CDATA Text</a>
</x>

X.java

public class A
{
    private B b;
    private D d;
    private String cdata;

    @JsonCreator
    public PropertyDef(Map<String,Object> props)
    {
        setB((String) props.get("b"));
        setD((String) props.get("d"));
        setCdata((String) props.get(""));
    }
}