2016-08-27 15 views
0

jaxbを使用してxml文字列を解析しようとしています。 実際、リテラルで10進値を抽出する必要があります。私は値を印刷しようとしたjaxbを使用してxml文字列を解析します。

package client; 

import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 

@XmlRootElement 
public class Results { 

    @XmlElement 
    String result; 

    @XmlElement 
    Double binding; 

    @XmlElement 
    Double literal; 
    public Double getLiteral() 
    { 
     return literal; 
    } 
    public Double geBinding() 
    { 
     return binding; 
    } 
    public String getResult() 
    { 
     return result; 
    } 

} 

、私はヌル。だからを取得していますどのように取得することができます:私は、Javaクラスの結果を持って

<results> 
    <result> 
     <binding name="value"> 
     <literal datatype="http://www.w3.org/2001/XMLSchema#decimal">369.0</literal> 
     </binding> 
    </result> 
    </results> 

:XML文字列です

リテラルタグ間の10進値?

Results re=(Results) JAXBContext.newInstance(Results.class) 
      .createUnmarshaller() 
      .unmarshal(new StringReader(my_xml)); 

System.out.println(re.getLiteral()); 

答えて

1

結果クラスは、解析しようとしているXMLの構造を反映していません。 results要素は、result要素で構成され、順にbindingで構成され、literalで構成されます。

JAXBでこれを行うには、同様の構造に従わなければなりません。 literalの値にアクセスするには

@XmlRootElement 
public class Results { 

    @XmlElement 
    Result result; 

    public Result getResult() { 
     return result; 
    } 
} 

public class Result { 
    @XmlElement 
    Binding binding; 

    public Binding getBinding() { 
     return binding; 
    } 
} 

public class Binding { 
    @XmlElement 
    Double literal; 

    public Double getLiteral() { 
     return literal; 
    } 
} 

、我々はresults.getResult().getBinding().getLiteral()のようなゲッターを呼び出すことができます。

ただし、これが発生してアプリケーションがXMLを多く扱っていない場合は、XPathの使用を検討することができます。あなたのコードを簡素化する

0

一つの方法は、各サブ要素の追加のクラスを避けるためにできるようにあなたのフィールドに直接要素や属性の内容をマッピングすることができるというXPATHなどを提供することができ​​EclipseLink's JAXBとそのXmlPathアノテーションを使用することです。例えば

あなたのケースでは、マッピングは次のようになります。

<dependency> 
    <groupId>org.eclipse.persistence</groupId> 
    <artifactId>eclipselink</artifactId> 
    <version>2.6.3</version> 
</dependency> 

、明示的に感謝を使用するには、コンテキストファクトリを指定する:あなたは、あなたのプロジェクトにこの依存関係を追加する必要があります

@XmlPath("result/binding/literal/text()") 
Double literal; 

起動コマンドで設定するシステムプロパティ-Djavax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

ここでは簡略化する方法について説明しているMOXyについての良い記事ですその機能を備えたコード。

関連する問題