来自子元素的Jackson XmlMapper地图

时间:2016-07-27 16:40:04

标签: java xml xml-parsing

我使用Jackson XmlMapper将xml映射到POJO但我有以下问题:

我的XML看起来像这样(不是原始的,只是一个例子):

<?xml version="1.0" encoding="UTF-8"?>
<result>
    <pojo>
        <name>test</name>
    </pojo>
</result>

问题是,我不想解析“结果”对象。我不想将pojo解析为自己的对象。我可以使用XmlMapper吗?

谢谢你!

阿图尔

2 个答案:

答案 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>
}