我使用Jackson XmlMapper将xml映射到POJO但我有以下问题:
我的XML看起来像这样(不是原始的,只是一个例子):
<?xml version="1.0" encoding="UTF-8"?>
<result>
<pojo>
<name>test</name>
</pojo>
</result>
问题是,我不想解析“结果”对象。我不想将pojo解析为自己的对象。我可以使用XmlMapper吗?
谢谢你!阿图尔
答案 0 :(得分:2)
你可以这样做,但你必须写一些锅炉板代码。
您必须创建XMLStreamReader
的实例才能自定义读取xml输入。 next()
方法允许转到读者的下一个解析事件。这是一个与读者内部规则相关的棘手方法()。因此,请阅读文档以了解特殊性:
来自Javadoc:
int javax.xml.stream.XMLStreamReader.next()抛出XMLStreamException
获取下一个解析事件 - 处理器可以返回所有连续的 单个块中的字符数据,或者可以将其拆分为多个 块。如果属性javax.xml.stream.isCoalescing设置为true 元素内容必须合并,并且只有一个CHARACTERS事件必须 返回连续的元素内容或CDATA部分。通过 必须透明地扩展和报告默认实体引用 到申请。如果实体引用,则抛出异常 不能扩大。如果元素内容为空(即内容为&#34;&#34;) 那么不会报告任何CHARACTERS事件。
给出以下XML:content textHello&lt; / greeting&gt;]]&gt;其他内容 在foo上调用next()的行为将是:1-评论 (评论)2-然后字符部分(字符)3-然后 CDATA部分(另一个CHARACTERS)4-然后是下一个字符部分 (另一个字符)5-然后是END_ELEMENT
注意:空元素(例如)将报告两个 单独的事件:START_ELEMENT,END_ELEMENT - 这会保留解析 空元素的等价性。这个方法会抛出一个 如果在hasNext()之后调用它返回false,则抛出IllegalStateException。
返回:与当前解析事件
对应的整数代码
让我说明进行单元测试的方法:
@Test
public void mapXmlToPojo() throws Exception {
XMLInputFactory factory = XMLInputFactory2.newFactory();
InputStream inputFile = MapXmlToPojo.class.getResourceAsStream("pojo.xml");
XMLStreamReader xmlStreamReader = factory.createXMLStreamReader(inputFile);
XmlMapper xmlMapper = new XmlMapper();
xmlStreamReader.next();
xmlStreamReader.next();
Pojo pojo = xmlMapper.readValue(xmlStreamReader, Pojo.class);
Assert.assertEquals("test", pojo.getName());
}
答案 1 :(得分:0)
只是添加了更多内容(为了使这个通用),我不得不提取一个特定元素并将其映射到java对象,在这种情况下,只要遇到该标签,我们就可以进行条件检查拿出来并映射相同。
我添加了while (xmlStreamReader.hasNext()) {
xmlStreamReader.next();
if (xmlStreamReader.nextTag() == XMLEvent.START_ELEMENT) {
QName name = xmlStreamReader.getName();
if (("spcific_name").equalsIgnoreCase(name.getLocalPart())) {
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
result = objectMapper.readValue(xmlStreamReader, Pojo.class);
break;
}
}
}
来忽略不需要的字段,以防我们的pojo映射的字段少于从最终源获取的字段。
下面是经过测试的代码-
@using (Html.BeginForm("ForgotPassword", "Account", FormMethod.Post, new
{
id = "forgotPassForm"
}))
{
<div class="row">
<div class="col-sm-offset-4 col-sm-4 input-email-forgotPassword">
@Html.AntiForgeryToken()
@Html.TextBoxFor(m => m.Email, new { @class = "form-control form-control-text", Placeholder = @Localization.Email })
@Html.ValidationMessageFor(m => m.Email, "", new { @class = "text-danger" })
</div>
</div>
<div class="row">
<div class="col-sm-offset-4 col-sm-4">
<button type="button" class="forgot_password" id="sendEmailBtn" disabled>@Localization.SendEmail</button>
<div class="messageWrapper">
<div id="confirmMessageSent" hidden>
<i class="fa fa-check-circle"></i>
<p>@Localization.MailHasBeenSent.</p>
<p>@Localization.TheLinkWillBeValid.</p>
</div>
<div id="errorMessage" hidden>
<i class="fa fa-times-circle"></i>
</div>
</div>
</div>
</div>
}
@section scripts{
<script type="text/javascript" src="~/Content/scripts/Views/Account/ForgotPassword.js"></script>
}