【问题标题】:How to serialize POJO to xml with namespace prefix如何使用命名空间前缀将 POJO 序列化为 xml
【发布时间】:2014-05-18 02:28:26
【问题描述】:

Spring 提供了几种通过 HttpMessageConverter 将 POJO 转换为 XML 的方法。但是,我很难找到一个支持带有前缀的自定义名称空间的名称。

例如来自

public class Student {
   String name;
   String address;
   Integer score;
}

<?xml version="1.0" encoding="UTF-8"?> 
<foo:Student xmlns:foo="http://schemas.foo.com/student">
   <foo:name>Some Name</foo:name>
   <foo:address>Address</foo:address>
   <foo:score>95</foo:score>
</foo:Student>

我很高兴地将 MappingJackson2HttpMessageConverter 与 jackson-dataformat-xml 一起使用,直到我意识到它不支持自定义前缀。

然后我研究了将 MarshallingHttpMessageConverter 与 XStreamMarshaller 一起使用,结果发现 XStream 也不支持自定义前缀。

任何人都可以参考我如何使用自定义命名空间前缀将 POJO 序列化为 xml 的示例吗?谢谢。

【问题讨论】:

    标签: spring spring-mvc jackson xstream jaxb2


    【解决方案1】:

    我已经为杰克逊解决了类似的问题。首先你必须使用woodstox XML 处理器。

    <dependency>
      <groupId>org.codehaus.woodstox</groupId>
      <artifactId>woodstox-core-asl</artifactId>
      <version>4.4.0</version>
    </dependency>
    

    比我这样添加命名空间 perfix/uri 映射:

      XmlMapper mapper = new XmlMapper();
      // override default instance of WstxOutputFactory
      mapper.getFactory().setXMLOutputFactory(new WstxOutputFactory() {
        @Override
        public XMLStreamWriter createXMLStreamWriter(Writer w) throws XMLStreamException {
          mConfig.setProperty(WstxInputProperties.P_RETURN_NULL_FOR_DEFAULT_NAMESPACE,  true);
          XMLStreamWriter result = super.createXMLStreamWriter(w);
          result.setPrefix("xlink", "http://www.w3.org/1999/xlink");
          return result;
        }
      });
    

    当然这不是优雅的灵魂,但我不确定是否还有其他方法。我希望Jackson 会在未来的版本中添加对前缀的api 支持。

    但我想在你的情况下需要带前缀的默认命名空间,这似乎更困难,因为杰克逊不支持默认命名空间 (https://github.com/FasterXML/jackson-dataformat-xml/issues/18),即使使用带有 @JacksonXmlRootElement(namespace="http://xmlns.uri.com") 的类继承,你仍然需要注释每个@JacksonXmlProperty(namespace="http://xmlns.uri.com")的属性

    【讨论】:

    • 如果我只想要根元素上的前缀怎么办?
    • 这对我不起作用,没有输出命名空间。设置输入属性的行对我来说似乎很可疑,但将其替换为 mConfig.enableAutomaticNamespaces(true); 效果很好。
    猜你喜欢
    • 2015-03-31
    • 2011-01-21
    • 2013-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-15
    • 2012-09-29
    相关资源
    最近更新 更多