0

ミドルウェアから取得したこのような XML があります

<Example library="somewhere">

   <book>

     <AUTHORS_TEST>Author_Name</AUTHORS_TEST>
     <EXAMPLE_TEST>Author_Name</EXAMPLE_TEST>

   </book>

</Example>

私がやりたいことは、XMLをJavaオブジェクト(およびその逆)に次のように変換することです:

class Example
 {

 private String authorsTest;
 private String exampleTest;

  }

したがって、これら2つをマッピングする方法はありますか?注意すべきことは、XMLタグ名とクラス属性名が異なることです.したがって、最小限の変更でこれを実装することを提案できますか?Xstreamは良い選択ですが、大きなエイリアスを追加するのが難しいフィールドの数なので、XStream 以外のより良い選択肢はありますか?

4

3 に答える 3

3

あなたが探しているのは XML バインディングと呼ばれるもので、実際に xml を xml スキーマに基づいて Java クラスに変換します。このリファレンス実装はjaxb ですが、他にも多くの代替手段があります。

于 2012-05-09T07:34:18.480 に答える
3

これを行う優れたライブラリがあります。簡単なものは、たとえばXStreamです。

Two Minute Tutorialのこの例を参照してください。

Person joe = new Person("Joe", "Walnes");
joe.setPhone(new PhoneNumber(123, "1234-456"));
joe.setFax(new PhoneNumber(123, "9999-999"));

これを XML に変換するには、XStream を簡単に呼び出すだけです。

String xml = xstream.toXML(joe);

結果の XML は次のようになります。

<person>
  <firstname>Joe</firstname>
  <lastname>Walnes</lastname>
  <phone>
    <code>123</code>
    <number>1234-456</number>
  </phone>
  <fax>
    <code>123</code>
    <number>9999-999</number>
  </fax>
</person>

XStream はとても使いやすいので、私は XStream を選びます。XML から Java クラスを生成するなど、より複雑なことをしたい場合は、Miquel が言及したJAXBを調べてください。しかし、それはより複雑で、開始するのにより多くの時間を必要とします。

于 2012-05-09T07:32:08.270 に答える
1

注: 私はEclipseLink JAXB(MOXy)のリーダーであり、JAXB 2(JSR-222)エキスパートグループのメンバーです。

ほとんどのXMLバインディングライブラリでは、XML表現のネストのレベルごとにオブジェクトが必要です。EclipseLink JAXB(MOXy)には、@XmlPathXPathベースのマッピングでこの制限を取り除くことができる拡張機能があります。

@XmlPath以下は、拡張機能をユースケースに適用する方法のデモンストレーションです。

package forum10511601;

import javax.xml.bind.annotation.*;
import org.eclipse.persistence.oxm.annotations.XmlPath;

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

    @XmlAttribute
    private String library;

    @XmlPath("book/AUTHORS_TEST/text()")
    private String authorsTest;

    @XmlPath("book/EXAMPLE_TEST/text()")
    private String exampleTest;

}

jaxb.properties

MOXyをJAXBプロバイダーとして指定するにはjaxb.properties、ドメインモデルと同じパッケージで名前が付けられたファイルを次のエントリで追加する必要があります(「JAXBプロバイダーとしてのEclipseLink MOXyの指定」を参照)。

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

デモ

MOXyはJAXB(JSR-222)実装であるため、標準のJAXBランタイムAPI(JavaSE6以降のJRE/JDKに含まれています)を使用します。

package forum10511601;

import java.io.File;
import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Example.class);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("src/forum10511601/input.xml");
        Example example = (Example) unmarshaller.unmarshal(xml);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(example, System.out);
    }

}

input.xml / Output

<?xml version="1.0" encoding="UTF-8"?>
<Example library="somewhere">
   <book>
      <AUTHORS_TEST>Author_Name</AUTHORS_TEST>
      <EXAMPLE_TEST>Author_Name</EXAMPLE_TEST>
   </book>
</Example>
于 2012-05-09T09:14:18.453 に答える