5

ご挨拶!次のような XML コンテンツをクライアントに返すサーバーがあります。

<string xmlns="...">foobar</string>

私は JAXB を初めて使用し、これを除いて多くの作業を行いました。これを文字列との間でマーシャリングおよびアンマーシャリングするのはかなり簡単だと思いました。しばらく時間がかかりましたが、最終的にこれを次のようにマーシャリングする方法を見つけました

    public static String ToXML(String s) throws Exception
    {
        JAXBContext context = JAXBContext.newInstance(String.class);
        Marshaller marshaller = context.createMarshaller();
        StringWriter sw = new StringWriter();
        marshaller.marshal(new JAXBElement(new QName("", "String"), String.class, s), sw);

        return sw.toString();
    }

私の質問は、これを非整列化する方法です。ルート要素として注釈を付けることはできません。java.lang をパッケージとして使用して JAXBContext の新しいインスタンスを作成することができません (ObjectFactory 欠落例外が発生します)。

伝える知恵はありますか?これはそれほど難しいことではありませんよね?

4

3 に答える 3

11

XML構造に準拠するオブジェクトモデルを作成し、JAXBにそれをアンマーシャリングするように指示する必要があります。あなたの例は単純に見えるかもしれませんが、それはJAXBの目的ではありません。

次のようなものを試してください。

@XmlRootElement(name="string", namespace="blah")
public class MyString {
   @XmlValue
   String value;
}

JAXBContext context = JAXBContext.newInstance(MyString.class);
MyString myString = (MyString) context.createUnmarshaller().unmarshal(...);

これにより、XMLがアンマーシャリングされます<string xmlns="blah">foobar</string>。それに応じて名前空間を変更します。多くの名前空間がある場合、JAXBは実際にはあなたのためのツールではありません。

于 2009-10-17T05:38:59.907 に答える
8

私はこれに驚いたが、以下はうまくいくようだ:

final String xmlString = "<string>value</string>";
final StringReader xmlReader = new StringReader(xmlString);
final StreamSource xmlSource = new StreamSource(xmlReader);
final JAXBContext jaxbContext = JAXBContext.newInstance(String.class);
final Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
final String stringValue = unmarshaller.unmarshal(xmlSource, String.class).getValue();

それはあなたが探していたものですか?

于 2009-10-17T14:19:22.970 に答える
3

JAXB を使用している場合は、XML スキーマを中心にコードを作成する必要があります。つまり、foo.xsd などのファイルがある場合は、xjc コンパイラを介して実行する必要があります (デフォルトでは JDK 6 で、それ以外の場合は JAXB 2 をダウンロードして使用できます)。これにより、スキーマが読み取られ、スキーマ内の要素を持つ Java Bean および関連する ObjectFactory クラスが生成されます。Java Bean クラスは、注釈付きの通常の POJO のように見えます。ObjectFactory クラスは、JAXB 実装が XML を対応する Java Bean に変換するために必要です。これは、ObjectFactory の欠落例外を説明しています。

難しいことではありませんが、多少の脚の作業が必要です。本番アプリケーションの 1 つに使用していますが、非常に優れています。JDK の一部になった今、私はそれをもっと使っていると思います。

于 2009-10-17T04:11:15.223 に答える