2

私はこのようなxmlを持っています

<abc:city>
  <def:cityname />
  <xyz:postalTown>
     Sacramento
  </xyz:postalTown>
</abc:city>

<abc:city>
  <def:cityname />
  <pqr:postalTown>
     Sacramento
  </pqr:postalTown>
</abc:city>

xstream はこれらの名前空間を 'abc' のように処理できますか?<abc:city>

また、応答が来ることに気付いていないため、の名前空間を<pqr:postalTown>変更できます。これを xstream で動的に処理するにはどうすればよいですか。

これが xstream で不可能な場合。jaxbを使って処理できますか?

編集:私のクラスは市になります:

Class City{
String cityName;
String postalTown;
}

タグにプレフィックスが含まれているため、上記のxmlをCityクラスにマップするにはどうすればよいですか?

4

1 に答える 1

3

アップデート

プレフィックスが名前空間宣言に対応していない場合は、関連する質問から以下にリンクした回答のアプローチを使用できます。


名前空間の資格に関する注意事項

使用される接頭辞は、オブジェクトから XML へのマッピングに関しては機能しません。xyzおよびプレフィックスが同じ名前空間に対応している限り、pqr名前空間をサポートするオブジェクトから XML へのソリューションで問題ありません。

次のドキュメントには異なる接頭辞が含まれていますが、名前空間修飾は同じです。

ドキュメント #1

<abc:city xmlns:abc="ABC" xmlns:def="DEF" xmlns:ghi="XYZ">
    <def:cityName/>
    <ghi:postalTown>
        Sacramento
    </ghi:postalTown>
</abc:city>

ドキュメント #2

<jkl:city xmlns:jkl="ABC" xmlns:mno="DEF" xmlns:pqr="XYZ">
    <mno:cityName/>
    <pqr:postalTown>
        Sacramento
    </pqr:postalTown>
</jkl:city>

JAXB と名前空間

City以下は、クラスを上記の XML ドキュメントにマップする方法です。@XmlRootElementとの@XmlElement注釈で指定されているのはプレフィックスではなく名前空間 URI であることに注意してください。

package forum11932402;

import javax.xml.bind.annotation.*;

@XmlRootElement(namespace="ABC")
public class City {

    @XmlElement(namespace="DEF")
    String cityName;

    @XmlElement(namespace="XYZ")
    String postalTown;

}

以下は、JAXB と名前空間に関する情報です。


デモコード

次のデモ コードを使用して、この回答で以前に投稿した XML ドキュメントのいずれかをアンマーシャリングできます。

package forum11932402;

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

public class Demo {

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

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("src/forum11932402/input.xml");
        City city = (City) unmarshaller.unmarshal(xml);

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

}

以下は、デモ コードを実行した結果の出力です。JAXB 実装は、新しいプレフィックスを割り当てました。cityName要素はまだ名前空間で修飾されており、 として宣言されたデフォルトの名前空間に対応していますxmls="DEF"

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns3:city xmlns="DEF" xmlns:ns2="XYZ" xmlns:ns3="ABC">
    <cityName></cityName>
    <ns2:postalTown>
        Sacramento
    </ns2:postalTown>
</ns3:city>
于 2012-08-13T11:22:39.057 に答える