3

私は、XML 要素を Java クラスにバインドするための優れた方法をあちこち探してきました。実装するのはかなり簡単なことのように思えますが (簡単という価値があるため)、どこを見ても、XSD、明示的なマッピング、および他の多くのものが必要であり、本当に邪魔になります。

これは、サイトマップを表す Java オブジェクトに関する私の (おそらく不完全な) アイデアです。

public class Sitemap {

    private List<Url> urls;

    public List<Url> getUrls() {
        return urls;
    }

    public void setUrls(List<Url> urls) {
        this.urls = urls;
    }
}

私ができることを探しています:

Sitemap sitemap = (Sitemap) Foo.fromXml("sitemap.xml")

そのようなもの、または少なくとも同様のもの。そのようなことはありますか?

4

2 に答える 2

3

以下は、JAXB ( JSR-222 ) でこれを行う方法です。Java SE 6 には実装が含まれています。EclipseLink MOXyなどの他の実装もあります(私は技術リーダーです)。

簡潔な答え

注釈または XML スキーマを使用して、JAXB で次の API 呼び出しを使用できます。

Sitemap sitemap = JAXB.unmarshal(xml, Sitemap.class);

長い答え

以下は、より詳細な例です。

サイトマップ

クラスを少し変更しました。クラスが何なのかわからなかっUrlたので、 に変更しましたjava.net.URL。ドメイン モデルでは注釈が必要ないことに注意してください。

package forum10854001;

import java.net.URL;
import java.util.List;

public class Sitemap {

    private List<URL> urls;

    public List<URL> getUrls() {
        return urls;
    }

    public void setUrls(List<URL> urls) {
        this.urls = urls;
    }
}

デモ

短い回答で使用されているコードの代わりに、JAXBContext. JAXBContext は、初期化されたすべてのメタデータを表すスレッド セーフなオブジェクトです。Marshallerおよびオブジェクト プロバイダはUnmarshaller、クラスに追加の柔軟性を提供しますJAXB

以下のコードは、XML を読み取り、書き戻す方法を示しています。

package forum10854001;

import javax.xml.bind.*;
import javax.xml.transform.stream.StreamSource;

public class Demo {

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

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        StreamSource xml = new StreamSource("src/forum10854001/input.xml");
        JAXBElement<Sitemap> jaxbElement = unmarshaller.unmarshal(xml, Sitemap.class);

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

    }

}

input.xml/出力

<?xml version="1.0" encoding="UTF-8"?>
<sitemap>
    <urls>http://www.eclipse.org/eclipselink/moxy.php</urls>
    <urls>http://jaxb.java.net</urls>
</sitemap>

詳細については

于 2012-06-01T17:11:30.340 に答える
1

XStreamも検討できます。次に示すのは、Blaise のコードとほぼ同じですが、多様性のために反対方向 (XML ではなくオブジェクトから開始) で動作します。

public class Sitemap{
      private List<URL> urls = new ArrayList();

      // I left out the setters and getters

      public static void main(String[] args) throws IOException {
         Sitemap sitemap = new Sitemap();
         sitemap.urls.add(new URL("http://www.eclipse.org/eclipselink/moxy.php"));
         sitemap.urls.add(new URL("http://jaxb.java.net"));

         XStream xs = new XStream(new DomDriver());
         String xmlString = xs.toXML(sitemap);
         System.out.println(xmlString);
         Sitemap readBack = (Sitemap) xs.fromXML(xmlString);
      }
   }

次の出力が得られます。

<com.your.name.here.Sitemap>
  <urls>
    <url>http://www.eclipse.org/eclipselink/moxy.php</url>
    <url>http://jaxb.java.net</url>
  </urls>
</com.your.name.here.Sitemap>

また、デバッガーでブレークポイントを設定して readBack を表示することができ、両方の URL があります。

于 2012-06-01T17:33:57.987 に答える