首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用jackson-数据格式- XML自定义根元素进行xml反序列化?

使用jackson-数据格式- XML自定义根元素进行xml反序列化?
EN

Stack Overflow用户
提问于 2016-09-02 11:19:28
回答 2查看 5.2K关注 0票数 6

因此,我现在已经成功地将杰克逊用于JSON序列化/反序列化,现在我也尝试使用它来实现XML序列化/反序列化,使用它的jackson-dataformat-xml-2.3.0.jar

我用过

objectmapper.reader(Student.class).withRootName("prefix:student").readValue(jsonString)

将我的JSON (有前缀的根名)反序列化为Student类,它成功地工作了。

现在,我正在尝试将我的XML字符串(具有前缀的根名)反序列化为Student

XML:

代码语言:javascript
复制
<prefix:student>
  <name>
    Jack Jones
  </name>
  <id>1</id>
</prefix:student>

我的POJO:

代码语言:javascript
复制
    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "", propOrder = {
        "name",
        "id",
        ....
    })
    @XmlRootElement(name = "student")
    public class Student
    {

        protected String name;
        BigInteger id;  
..........................
    }

我在jackson-dataformat-xml中使用jackson-dataformat-xml进行反分类,如下所示:

代码语言:javascript
复制
xmlMapper.reader(Student.class).withRootName("prefix:student").readValue(xmlString)

我得到以下例外:

代码语言:javascript
复制
java.io.IOException: com.ctc.wstx.exc.WstxParsingException: Undeclared namespace prefix "prefix"
 at [row,col {unknown-source}]: [1,9]
    at com.fasterxml.jackson.dataformat.xml.util.StaxUtil.throwXmlAsIOException(StaxUtil.java:24)
    at com.fasterxml.jackson.dataformat.xml.XmlFactory._createParser(XmlFactory.java:473)
    at com.fasterxml.jackson.dataformat.xml.XmlFactory._createParser(XmlFactory.java:26)
    at com.fasterxml.jackson.core.JsonFactory.createParser(JsonFactory.java:844)
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2091)

Caused by: com.ctc.wstx.exc.WstxParsingException: Undeclared namespace prefix "prefix"
 at [row,col {unknown-source}]: [1,9]
    at com.ctc.wstx.sr.StreamScanner.constructWfcException(StreamScanner.java:606)
    at com.ctc.wstx.sr.StreamScanner.throwParseError(StreamScanner.java:479)
    at com.ctc.wstx.sr.InputElementStack.resolveAndValidateElement(InputElementStack.java:507)
    at com.ctc.wstx.sr.BasicStreamReader.handleStartElem(BasicStreamReader.java:2977)
    at com.ctc.wstx.sr.BasicStreamReader.handleRootElem(BasicStreamReader.java:2098)
    at com.ctc.wstx.sr.BasicStreamReader.nextFromProlog(BasicStreamReader.java:2078)
    at com.ctc.wstx.sr.BasicStreamReader.next(BasicStreamReader.java:1134)
    at com.fasterxml.jackson.dataformat.xml.XmlFactory._initializeXmlReader(XmlFactory.java:581)
    at com.fasterxml.jackson.dataformat.xml.XmlFactory._createParser(XmlFactory.java:471)
    ... 6 more

对于使用自定义根名称的XML反序列化,我需要做什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-06 21:36:46

您的问题是,由于缺少prefix的命名空间声明,XML是无效的:如果启用了名称空间处理(大多数现代XML解析器都启用了名称空间处理),则Jackson模块不能对此做任何事情。

但是,根据其他答案,通常可以将底层XML解析器配置为禁用命名空间处理,在这种情况下,整个元素名称只是“本地名称”的一部分,因此不会维护名称空间信息。

只需确保使用WoodstoxAalto Stax解析器:我认为,在JDK中的解析器不支持任何命名空间模式。

票数 2
EN

Stack Overflow用户

发布于 2016-09-06 07:47:19

尝试将XmlMapper配置为忽略名称空间:

代码语言:javascript
复制
XMLInputFactory input = new WstxInputFactory();
input.setProperty(XMLInputFactory.IS_NAMESPACE_AWARE, Boolean.FALSE);
XmlMapper xmlMapper = new XmlMapper(new XmlFactory(input, new WstxOutputFactory()));

另外,您可能必须将@XmlRootElement(name= "student")更改为@XmlRootElement(name= "prefix:student")

编辑:

正如StaxMan所说,您的问题来自于使用未声明的前缀这一事实。

这可以通过您提供的日志(第1行和第9行=>未声明的命名空间前缀“前缀”)推断出来。

我的印象是,您无法修改XML字符串。

但是如果可以的话,StaxMan解决方案更干净,您应该添加名称空间声明,而不是禁用解析器名称空间验证:

代码语言:javascript
复制
<prefix:student xmlns:prefix="http://www.somenamespace.org">
  <name>
    Jack Jones
  </name>
  <id>1</id>
</prefix:student>
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39291104

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档