首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Jackson XML -用命名空间前缀反序列化XML

Jackson XML -用命名空间前缀反序列化XML
EN

Stack Overflow用户
提问于 2013-05-08 14:04:42
回答 3查看 17.8K关注 0票数 10

我正在使用Jackson插件(https://github.com/FasterXML/jackson-dataformat-xml),我不确定是否支持它,但我想知道是否可以使用命名空间前缀序列化和反序列化XML,如下所示:

代码语言:javascript
复制
<name:Foo>
  <name:Bar>
    <name:x>x</name:x>
    <name:y>y</name:y>
  </name:Bar>
</name:Foo>

我可以使用Jackson的插件生成这类XML,如下所示:

代码语言:javascript
复制
@JacksonXmlProperty(localName="name:Bar")
public Bar getBar() {
    return bar;
}

但是,我无法找到一种方法将POJO配置为从生成的XML反序列化。请参阅以下示例代码:

代码语言:javascript
复制
public class Bar{
    @JacksonXmlProperty(localName="name:x")
    public String x = "x";
    @JacksonXmlProperty(localName="name:y")
    public String y = "y";
}

代码语言:javascript
复制
@JacksonXmlRootElement(localName="name:Foo")
    public class Foo{
        private Bar bar;

        @JacksonXmlProperty(localName="name:Bar")
        public Bar getBar() {
           return bar;
        }

        public void setBar(Bar bar) {
            this.bar = bar;
        }   
}

代码语言:javascript
复制
public class TestDeserialization {

    public static void main(String[] args) throws Exception {
        Foo foo = new Foo();
        foo.setBar(new Bar());

        XmlMapper xmlMapper = new XmlMapper();
        String xml = xmlMapper.writerWithDefaultPrettyPrinter().writeValueAsString(foo);
        System.out.println(xml);
        System.out.println("XML Desearialzing....");
        Foo foo2= xmlMapper.readValue(xml, Foo.class);
        System.out.println(xmlMapper.writeValueAsString(foo2));
     }
}

尝试运行这个测试给了我一个例外:

代码语言:javascript
复制
Exception in thread "main" java.io.IOException: com.ctc.wstx.exc.WstxParsingException: Undeclared namespace prefix "name"

这是可以理解的,但我想知道是否有一种方法可以让它与Jackson XML一起工作?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-05-08 14:06:37

JacksonXmlProperty注释具有属性namespace。使用它来定义namespace

代码语言:javascript
复制
public class Bar {
    @JacksonXmlProperty(namespace = "name",localName="x")
    public String x = "x";
    @JacksonXmlProperty(namespace = "name",localName="y")
    public String y = "y";
} 

@JacksonXmlRootElement(namespace = "name", localName = "Foo")
public class Foo {
   private Bar bar;

   @JacksonXmlProperty(namespace = "name", localName = "Bar")
   public Bar getBar() {
      return bar;
   }

   public void setBar(Bar bar) {
      this.bar = bar;
   }
}
票数 9
EN

Stack Overflow用户

发布于 2021-03-31 13:13:02

虽然这是一个旧帖子,但我只是遇到了这个问题,唯一匹配服务调用所需的XML的解决方案是这样的,名称空间声明也使用前缀。

代码语言:javascript
复制
@JacksonXmlRootElement(localName = "entry")
abstract class BaseEntry implements Serializable { 
    private static final long serialVersionUID = 6835429382441010779L;
    private final String xmlns = "com.foo.bar"; 
    private String type;
    
    protected BaseEntry(String type) {
        this.type = type;
    }

    @JacksonXmlProperty(isAttribute = true)
    public String getType() {
        return type;
    }
    
    @JacksonXmlProperty(localName = "xmlns:ns2", isAttribute = true)
    public String getXmlns() {
        return xmlns;
    }
}

这产生的结果如下:

代码语言:javascript
复制
<entry type="com.foo.bar" xmlns:ns2="com.foo.bar">
...
</entry>
票数 4
EN

Stack Overflow用户

发布于 2022-10-25 15:55:25

xmlMapper配置为忽略命名空间可以避免此异常。

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

来自this answer

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16442805

复制
相关文章

相似问题

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