簡體   English   中英

Jackson XML - 使用命名空間前綴反序列化 XML

[英]Jackson XML - deserializing XML with namespace prefixes

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

<name:Foo>
  <name:Bar>
    <name:x>x</name:x>
    <name:y>y</name:y>
  </name:Bar>
</name:Foo>

我可以使用 Jackson 的插件生成這種類型的 XML,如下所示:

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

但是,我找不到配置我的 POJO 以從生成的 XML 反序列化的方法。 請參閱以下示例代碼:

public class Bar{
    @JacksonXmlProperty(localName="name:x")
    public String x = "x";
    @JacksonXmlProperty(localName="name:y")
    public String y = "y";
}

@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;
        }   
}

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));
     }
}

嘗試運行此測試給了我一個例外:

Exception in thread "main" java.io.IOException: com.ctc.wstx.exc.WstxParsingException: Undeclared namespace prefix "name"

這是可以理解的,但我想知道是否有辦法讓它與 Jackson XML 一起使用?

JacksonXmlProperty注釋具有屬性namespace 使用它來定義namespace

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;
   }
}

雖然這是一篇舊帖子,但我剛剛遇到了這個問題,匹配我的服務調用所需的 XML 的唯一解決方案是這樣的,其中命名空間聲明也使用前綴。

@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;
    }
}

這會產生類似的東西:

<entry type="com.foo.bar" xmlns:ns2="com.foo.bar">
...
</entry>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM