2016-10-25 5 views
0

私は私がコードXSDをスキップする方法:アンマーシャリング中に入力しますか?

JAXBContext jaxbContext = JAXBContext.newInstance(PaymentResponse.class); 
Unmarshaller um = jaxbContext.createUnmarshaller(); 

StringReader resRreader = new StringReader(res); 

final SAXParserFactory sax = SAXParserFactory.newInstance(); 
sax.setNamespaceAware(true); 
final XMLReader reader = sax.newSAXParser().getXMLReader(); 
final Source er = new SAXSource(reader, new InputSource(resRreader)); 

PaymentResponse response = (PaymentResponse)um.unmarshal(er); 
return response.getReturnResponse().getMessage(); 

の下に使用していますが、私は例外

プレフィックスXSDは、名前空間にバインドされていない持って、それを非整列化するXML

<?xml version="1.0" encoding="UTF-8"?> 
<ns1:paymentResponse xmlns:ns1="urn:Brifastservice"> 
    <return xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="tns:paymentAccount_CT_Result"> 
     <message xsi:type="xsd:string">[ERROR] Reference Number Same </message> 
     <status xsi:type="xsd:string">2007</status> 
    </return> 
</ns1:paymentResponse> 

を受け

sax.setNamespaceAware(false); 

その後、私は

javax.xml.bind.UnmarshalException: 
    unexpected element (uri:"", local:"ns1:paymentResponse"). 
    Expected elements are <{urn:someService}paymentResponse> 

を得る非整列化する方法を提案してください?私は

@javax.xml.bind.annotation.XmlSchema(
    namespace = "urn:someService", 
    elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED) 

答えて

1

XML文書は要素のXSDタイプを宣言するためにXSIを使用していますが、XSD名前空間は、この文書内の任意の場所に定義されていないパッケージ情報を持っています。

受信したXML文書で文字列を修正し、構文解析する前にルート要素にxmlns:xsd="http://www.w3.org/2001/XMLSchema"宣言を強制的に追加することです。

適切soluctionは宣言名前空間を追跡し、また、不足しているXSD名前空間を注入するNamespaceSupportオブジェクトの使用をstartDocumentendDocumentstartPrefixMappingendPrefixMappingイベントをインターセプトしますカスタムのContentHandlerを作成することです。この例(挿入された名前空間を除く)は、の受信ネームスペースマッピングJavaでのXML処理(オンラインhttp://www.cafeconleche.org/books/xmljava/chapters/ch06s09.htmlから入手できます)を参照してください。

関連する問題