java - 无法将 xml 字符串解组为 java 对象
问题描述
Unmarshal xml-string to java-object 给出以下错误:
javax.xml.bind.UnmarshalException:意外元素(uri:“”,本地:“AppServerResponse”)。预期的元素是 <{ http://www.coda.com/efinance/schemas/appserver }AppServerResponse>
这是 AppServerResponse Java 类
@XmlRootElement (name = "AppServerResponse", namespace = "http://www.coda.com/efinance/schemas/appserver")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "AppServerResponse", namespace = "http://www.coda.com/efinance/schemas/appserver", propOrder = {
"getEnvironment",
"listUserCompanies",
"softToHardDate"
})
public class AppServerResponse extends ServiceResponse
{
@XmlElement(name = "GetEnvironment", namespace = "http://www.coda.com/efinance/schemas/appserver")
protected GetEnvironmentResponseVerb getEnvironment;
@XmlElement(name = "ListUserCompanies", namespace = "http://www.coda.com/efinance/schemas/appserver")
protected ListUserCompaniesResponseVerb listUserCompanies;
@XmlElement(name = "SoftToHardDate", namespace = "http://www.coda.com/efinance/schemas/appserver")
protected SoftToHardDateResponseVerb softToHardDate;
解组函数和 xml 消息的代码已解组:
String strResponse = "<AppServerResponse uri=\"http://www.coda.com/efinance/schemas/appserver\" version=\"2.0\" >"
+ "<GetEnvironment>"
+ "<Response status=\"success\">"
+ "<Environment>"
+ "<CmpCode>TEST</CmpCode>"
+ "<CapCode>INTERFACE</CapCode>"
+ "<HomeCurr>EUR</HomeCurr>"
+ "<DateOrder>1</DateOrder>"
+ "<DateDisplay>1</DateDisplay>"
+ "<DateSep>/</DateSep>"
+ "<HomeCurrDps>2</HomeCurrDps>"
+ "<HomeCurrSymbol>€</HomeCurrSymbol>"
+ "<HomeCurrSymbolPos>before</HomeCurrSymbolPos>"
+ "<HomeCurrLinkType>no_link</HomeCurrLinkType>"
+ "<HomeCurrParent>EURO</HomeCurrParent>"
+ "<CurrentPeriod>2018/4</CurrentPeriod>"
+ "<CmpTimeStamp>11</CmpTimeStamp>"
+ "<CapTimeStamp>3</CapTimeStamp>"
+ "<UsrTimeStamp>12</UsrTimeStamp>"
+ "<ServerVersion>14.000.0014</ServerVersion>"
+ "</Environment>"
+ "</Response>"
+ "</GetEnvironment>"
+ "</AppServerResponse>";
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(false);
DocumentBuilder db;
db = dbf.newDocumentBuilder();
Document docResponse = db.parse(new InputSource(new StringReader(strResponse)));
writeXmlDocumentToXmlFile(docResponse);
JAXBContext contextResponse = JAXBContext.newInstance(responseClass);
Unmarshaller u = contextResponse.createUnmarshaller();
returnValue = u.unmarshal(docResponse);
解决方案
您的 JAXB 注释指定您的元素位于http://www.coda.com/efinance/schemas/appserver
名称空间中,但您的响应字符串中的元素实际上不在名称空间中。看起来您打算通过设置默认命名空间
String strResponse = "<AppServerResponse uri=\"http://www.coda.com/efinance/schemas/appserver\"..."
但该uri
属性实际上并没有这样做。相反,您需要以下xmlns
属性:
String strResponse = "<AppServerResponse xmlns=\"http://www.coda.com/efinance/schemas/appserver\"..."
请注意xmlns
属性名称而不是uri
.
推荐阅读
- powerbi - 无法实时连接到 SSAS 表格,但可以进行导入
- python - 按 ID 计算天数 - Pandas
- arrays - Vlookup Importrange 数组公式不起作用
- c++ - 如何使用(无绑定?)纹理缓冲区对象将数据传输到着色器?
- tsql - 如何在 t-sql (Azure Synapse) 的 CAST/CONVERT 中使用字符串函数
- powerbi - Power BI(DAX):All() 仅适用于列的 2 个值
- jestjs - 如何配置 jest-puppeteer 以同时运行 2 个浏览器实例?
- shopify - ShopifySharp.Product.BodyHtml 为空,即使 Shopify 响应包含 body_html
- android - 来自 admob 的广告未显示,因为在 admob 和 firebase 中使用与应用程序相同的包名称
- ios - Swift scrollToItem 在子类化 UICollectionViewController 时有效。但不适用于“有关系”collectionView