アップデート
プレフィックスが名前空間宣言に対応していない場合は、関連する質問から以下にリンクした回答のアプローチを使用できます。
名前空間の資格に関する注意事項
使用される接頭辞は、オブジェクトから 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>