2016-09-29 3 views
8

XMLスニペットをNULLに。JAXB非整列化ネストされた要素は

@XmlRootElement(name = "datasource") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class DataSource { 

    @XmlAttribute(name = "formatted-name") 
    protected String formattedName; 
    @XmlAttribute(name = "inline") 
    protected String inline; 
    @XmlElement(name = "repository-location") 
    protected RepositoryLocation repositoryLocation; 

    // public getters and setters for fields above 

    @XmlAccessorType(XmlAccessType.FIELD) 
    public static class RepositoryLocation { 

     @XmlAttribute(name = "derived-from") 
     protected String derivedFrom; 
     @XmlAttribute(name = "id") 
     protected String id; 
     @XmlAttribute(name = "path") 
     protected String path; 
     @XmlAttribute(name = "revision") 
     protected String revision; 
     @XmlAttribute(name = "site") 
     protected String site; 

     // public getters and setters for fields above 
    } 
} 

たUnmarshaller::私がnullに成功し、出力データソースフィールド "formattedName" と "インライン"、しかし "repositoryLocation" であることができ

JAXBContext jaxbContext = JAXBContext.newInstance(DataSource.class); 
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); 
StringReader reader = new StringReader(responseXML); 
dataSourceResponse = (DataSource) unmarshaller.unmarshal(reader); 

ここに私のDataSourceクラスです。誰か助けてもらえますか?

+0

それが動作するはずですが。 'repositoryLocation'のgetter/setterがありますか? – ulab

+0

はい、私はそれらを持っています。 – toadead

+0

どのようにアンマーシャリングしますか? plsコードを追加します。 – ulab

答えて

2

問題を解決します!私は自分のJava 1.7ライブラリにいくつかのjarファイルがないことに気付きました。だから私は1.8にアップグレードすることにしました。それは魔法のように働いた!

3

JAXBはGetters/Settersなしで非整列化を行うことができ、フィールドはプライベートにすることもできます。 、上記DataSourceクラスを考えると、いくつかは、toString方法がDataSourceRepositoryLocationの両方に追加されたすべてのプロパティを次のプリントアウト生成した:

import javax.xml.bind.*; 
import javax.xml.bind.annotation.*; 
import java.io.StringReader; 

public class Jaxb { 

    public static void main(String[] args) throws JAXBException { 
     String xml = "<datasource formatted-name=\"blah\" inline=\"blah\">\n" + 
       " <repository-location derived-from=\"blah\" id=\"blah\"" + 
       " path=\"blah\" revision=\"blah\" site=\"blah\"/>\n" + 
       "</datasource>"; 

     JAXBContext context = JAXBContext.newInstance(DataSource.class); 
     Unmarshaller unmarshaller = context.createUnmarshaller(); 
     DataSource dataSource = (DataSource) unmarshaller.unmarshal(new StringReader(xml)); 
     System.out.println(dataSource); 
    } 

    @XmlRootElement(name = "datasource") 
    @XmlAccessorType(XmlAccessType.FIELD) 
    private class DataSource { 

     @XmlAttribute(name = "formatted-name") 
     private String formattedName; 
     @XmlAttribute(name = "inline") 
     private String inline; 
     @XmlElement(name = "repository-location") 
     private RepositoryLocation repositoryLocation; 

     @XmlAccessorType(XmlAccessType.FIELD) 
     private class RepositoryLocation { 

      @XmlAttribute(name = "derived-from") 
      private String derivedFrom; 
      @XmlAttribute(name = "id") 
      private String id; 
      @XmlAttribute(name = "path") 
      private String path; 
      @XmlAttribute(name = "revision") 
      private String revision; 
      @XmlAttribute(name = "site") 
      private String site; 

      @Override 
      public String toString() { 
       return "RepositoryLocation{" + 
         "derivedFrom='" + derivedFrom + '\'' + 
         ", id='" + id + '\'' + 
         ", path='" + path + '\'' + 
         ", revision='" + revision + '\'' + 
         ", site='" + site + '\'' + 
         '}'; 
      } 
     } 

     @Override 
     public String toString() { 
      return "DataSource{" + 
        "formattedName='" + formattedName + '\'' + 
        ", inline='" + inline + '\'' + 
        ", repositoryLocation=" + repositoryLocation + 
        '}'; 
     } 
    } 
} 
+0

これは私が入手したものです:DataSource {formattedName = '個人BIマート(コピー)'、インライン= '真'、バージョン= '9.2'、xmlBase = 'ヌル'、xmlnsUser = 'ヌル'、repositoryLocation = null} – toadead

2

はあまりにもJavaの1.7を試してみました、それが動作し、xml.txtに、XMLは

package testSingleJar.specificpackage; 

import java.io.BufferedReader; 
import java.io.File; 
import java.io.FileReader; 
import java.io.StringReader; 

import javax.xml.bind.JAXBContext; 
import javax.xml.bind.Unmarshaller; 
import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlAttribute; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 

/** 
* Hello world! 
* 
*/ 
public class App 
{ 
    public static void main(String[] args) throws Exception 
    { 
     JAXBContext jaxbContext = JAXBContext.newInstance(DataSource.class); 
     Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); 
     String responseXML = ""; 
     //filename is filepath string 
     BufferedReader br = new BufferedReader(new FileReader(new File("D:\\xml.txt"))); 
     String line; 
     StringBuilder sb = new StringBuilder(); 

     while((line=br.readLine())!= null){ 
      sb.append(line.trim()); 
     } 

     responseXML=sb.toString(); 
     StringReader reader = new StringReader(responseXML); 
     DataSource dataSourceResponse = (DataSource) unmarshaller.unmarshal(reader); 
     System.out.println(dataSourceResponse.getRepositoryLocation().getDerivedFrom()); 
    } 
} 


@XmlRootElement(name = "datasource") 
@XmlAccessorType(XmlAccessType.FIELD) 
class DataSource { 

    @XmlAttribute(name = "formatted-name") 
    protected String formattedName; 
    @XmlAttribute(name = "inline") 
    protected String inline; 
    @XmlElement(name = "repository-location") 
    protected RepositoryLocation repositoryLocation; 

    // public getters and setters for fields above 

    @XmlAccessorType(XmlAccessType.FIELD) 
    public static class RepositoryLocation { 

     @XmlAttribute(name = "derived-from") 
     protected String derivedFrom; 
     @XmlAttribute(name = "id") 
     protected String id; 
     @XmlAttribute(name = "path") 
     protected String path; 
     @XmlAttribute(name = "revision") 
     protected String revision; 
     @XmlAttribute(name = "site") 
     protected String site; 
     public String getDerivedFrom() { 
      return derivedFrom; 
     } 
     public void setDerivedFrom(String derivedFrom) { 
      this.derivedFrom = derivedFrom; 
     } 
     public String getId() { 
      return id; 
     } 
     public void setId(String id) { 
      this.id = id; 
     } 
     public String getPath() { 
      return path; 
     } 
     public void setPath(String path) { 
      this.path = path; 
     } 
     public String getRevision() { 
      return revision; 
     } 
     public void setRevision(String revision) { 
      this.revision = revision; 
     } 
     public String getSite() { 
      return site; 
     } 
     public void setSite(String site) { 
      this.site = site; 
     } 

    } 

    public String getFormattedName() { 
     return formattedName; 
    } 

    public void setFormattedName(String formattedName) { 
     this.formattedName = formattedName; 
    } 

    public String getInline() { 
     return inline; 
    } 

    public void setInline(String inline) { 
     this.inline = inline; 
    } 

    public RepositoryLocation getRepositoryLocation() { 
     return repositoryLocation; 
    } 

    public void setRepositoryLocation(RepositoryLocation repositoryLocation) { 
     this.repositoryLocation = repositoryLocation; 
    } 
} 

出力保存されます。何とか

関連する問題