2013-12-09 46 views
1

我試圖使用Jaxb解組將XML文件轉換爲Java對象。在將XML轉換爲Java對象時獲取不正確的值

   public static void main(String[] args) { 
         String input = "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd\">"+ 
              " <key>1</key>" + 
              "<income>100.335</income>" + 
             "</project>" ; 
     NexusClient c1 = new NexusClient(); 
         c1.getObject(input); 
        } 
    /*********/ 
     public boolean getObject(String input) { 
      InputSource inputSource = new InputSource(new StringReader(input)); 
      System.out.println(inputSource); 

      try { 
       JAXBContext jaxbContext = JAXBContext 
         .newInstance(mavenEntity.class); 
       Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); 
       mavenEntity mavenObject = (mavenEntity) jaxbUnmarshaller 
         .unmarshal(inputSource); 

       System.out.println("Success"+mavenObject.getIncome()); 
      } catch (JAXBException e) { 
       System.out.println("Unable to parse the XML Context"); 
       e.printStackTrace(); 
       return false; 
      } 

      return true; 
     } 

我在嘗試提取「收入」標記信息時遇到問題。我無法使用Jaxb提取正確的值。我pojo類是:

@XmlRootElement(name = "project", namespace = "http://maven.apache.org/POM/4.0.0") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class mavenEntity { 

    @XmlElement(name = "key", type = String.class) 
    private String key; 

    @XmlElement(name = "income", type = String.class) 
    private String income; 


    public String getKey() { 
     return key; 
    } 
    public void setKey(String key) { 
     this.key = key; 
    } 


    public String getIncome() { 
     return income; 
    } 
    public void setIncome(String income) { 
     this.income = income; 
    } 
} 

我得到Null作爲XML中的任何標籤的輸出。我猜在XML Annotation中我的名字空間存在一些問題。但我真的不明白它是什麼。在發佈之前,我參考了一些類似於this的鏈接做了一些基礎工作,但仍然是我的結果不正確。有人可以幫我嗎。

+0

很抱歉,但...什麼,其中C1爲? –

+0

對不起,我會更新它 – Vikram

+0

也更新與實際發生的事情,例如,什麼是失敗模式? –

回答

1

您將需要添加namespace@XmlElement註釋字段太

@XmlElement(name = "key", namespace = "http://maven.apache.org/POM/4.0.0") 
private String key; 

@XmlElement(name = "income", namespace = "http://maven.apache.org/POM/4.0.0") 
private String income; 

那是因爲你的根元素有一個特定的命名空間。由於嵌套元素沒有名稱空間前綴,因此它們使用根的名稱。我想這是JAXB需要的。

一些替代方案和/或解釋herehere

+0

它確實工作。 。但我有一個問題。爲什麼我需要爲所有元素放置命名空間?我的另一個問題是,如果從一個XML文件中,我需要避免爲Java對象的幾個字段,什麼忽略註釋我需要使用? – Vikram

+0

@asvikki我不完全確定爲什麼。我所鏈接的文章可能會有所幫助。至於避免字段被編組/編組,你可以使用'@ XmlTransient'。 –

+0

真棒。謝謝 !! – Vikram

2

模型中的名稱空間限定與文檔不匹配。您可以使用@XmlSchema指定包級別的名稱空間限定,而不是在@XmlRootElement@XmlElement的所有實例上指定名稱空間。

package-info.java

@XmlSchema( 
    namespace = "http://maven.apache.org/POM/4.0.0", 
    elementFormDefault = XmlNsForm.QUALIFIED) 
package org.example.foo; 

import javax.xml.bind.annotation.XmlNsForm; 
import javax.xml.bind.annotation.XmlSchema; 

mavenEntity.java

我已移除此類的不必要的說明(見:http://blog.bdoughan.com/2012/07/jaxb-no-annotations-required.html)。

package org.example.foo; 

import javax.xml.bind.annotation.XmlSchema; 

@XmlRootElement(name = "project") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class mavenEntity { 

    private String key; 

    private String income; 

} 

更多信息