2012-10-08 90 views
2

我想從服務中讀取XML數據(而且我無法更改數據)並且與Jackson XmlMapper有問題。如果我有XML像這樣:Jackson XmlMapper將XML轉換爲POJO,節點文本的關鍵是「」

<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

這對我的作品作爲一個獨立的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]' 

手指交叉它爲你的作品呢!

+0

是的,這是應該的工作方式。 – StaxMan

+0

這個作品,謝謝! – Tim

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("")); 
    } 
}