我收到了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>
我想要解组它,我正在使用下面的代码
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未绑定到命名空间
如果我使用
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)
答案 0 :(得分:1)
XML文档使用XSI声明元素的XSD类型,但XSD命名空间未在此文档中的任何位置定义。
快速而肮脏的解决方案是使用收到的XML文档修改字符串,并在解析之前在根元素中强制添加xmlns:xsd="http://www.w3.org/2001/XMLSchema"
声明。
正确的解决方案是创建一个拦截startDocument
,endDocument
,startPrefixMapping
和endPrefixMapping
事件的自定义ContentHandler,并使用NamespaceSupport
个对象跟踪声明的命名空间,并注入缺少的XSD命名空间。一个示例(减去注入的命名空间)可以在处理XML with Java 的接收命名空间映射一章中找到,可在http://www.cafeconleche.org/books/xmljava/chapters/ch06s09.html在线获得。