JAXBは、SOAPエンベロープが既に削除されている場合にのみXMLを非整列化できます。ただし、アンマーシャリングしようとしているSOAP応答には、soapエンベロープに名前空間宣言があります。soapエンベロープを削除すると、名前空間宣言も削除されます。名前空間がSOAPで宣言されている場合、JAXBを使用してSOAP応答を非整列化する方法はありますか?封筒?
非整列化する必要があるXMLの同様のサンプルを以下に示します。
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="http://example.com/">
<soapenv:Body>
<ns:getNumberResponse>
<number>123456789</number>
</ns:getNumberResponse>
</soapenv:Body>
</soapenv:Envelope>
これは石鹸の封筒を削除するとどうなります:
<ns:getNumberResponse>
<number>123456789</number>
</ns:getNumberResponse>
Soapエンベロープを削除すると、名前空間宣言もなくなります。接頭辞「ns」の名前空間定義が欠落しているため、JAXBは上記のxmlを非整列化できません。そのため、"The prefix "ns" for element "ns:getNumberResponse" is not bound."
エラーメッセージが返されます。どうすれば修正できますか?
JDK 1.5を使用していることに注意してください。 JDK 1.6でこれを解決する方法があるかどうかはわかりません。 JAXBを使用するために必要なjarをダウンロードしたため、JAXBを使用できました。
StAXパーサーを使用してSOAP=メッセージを解析し、XMLStreamReader
をgetNumberResponse
要素に進めて、クラスパラメーターを受け取る非整列化メソッドを使用できます。 StAXパーサーはJava SE 6に含まれていますが、Java SE 5の場合はダウンロードする必要があります。 Woodstox は人気のあるStAXパーサー。
応答
package forum11465653;
public class Response {
private long number;
public long getNumber() {
return number;
}
public void setNumber(long number) {
this.number = number;
}
}
デモ
XMLStreamReader
にはNamespaceContext
があります。 NamespaceContext
は、現在のレベルのアクティブな名前空間宣言をすべて知っています。 JAXB(JSR-222)実装はこれを活用して必要な情報を取得できます。
package forum11465653;
import Java.io.FileReader;
import javax.xml.bind.*;
import javax.xml.stream.*;
public class Demo {
public static void main(String[] args) throws Exception{
XMLInputFactory xif = XMLInputFactory.newFactory();
XMLStreamReader xsr = xif.createXMLStreamReader(new FileReader("src/forum11465653/input.xml"));
xsr.nextTag(); // Advance to Envelope tag
xsr.nextTag(); // Advance to Body tag
xsr.nextTag(); // Advance to getNumberResponse tag
System.out.println(xsr.getNamespaceContext().getNamespaceURI("ns"));
JAXBContext jc = JAXBContext.newInstance(Response.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
JAXBElement<Response> je = unmarshaller.unmarshal(xsr, Response.class);
System.out.println(je.getName());
System.out.println(je.getValue());
}
}
出力
http://example.com/
{http://example.com/}getNumberResponse
forum11465653.Response@781f6226
DOMパーサーを使用してSOAPメッセージ全体を解析できます。これにより、解析時にすべてのネームスペースを解決できます。次に、結果のDOMツリーから必要な要素を抽出し、アンマーシャラー。
DomDemo
package forum11465653;
import Java.io.File;
import javax.xml.bind.*;
import javax.xml.parsers.*;
import javax.xml.transform.dom.DOMSource;
import org.w3c.dom.*;
public class DomDemo {
public static void main(String[] args) throws Exception{
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
DocumentBuilder db = dbf.newDocumentBuilder();
Document d = db.parse(new File("src/forum11465653/input.xml"));
Node getNumberResponseElt = d.getElementsByTagNameNS("http://example.com/", "getNumberResponse").item(0);
JAXBContext jc = JAXBContext.newInstance(Response.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
JAXBElement<Response> je = unmarshaller.unmarshal(new DOMSource(getNumberResponseElt), Response.class);
System.out.println(je.getName());
System.out.println(je.getValue());
}
}
出力
{http://example.com/}getNumberResponse
forum11465653.Response@19632847