将独立指令添加到Jackson XML序列化

3
我正在尝试让Jackson生成类似JAXB的XML头,但我无法弄清如何添加“standalone ='yes'?”。
示例:
public class XmlTest {

    @XmlRootElement
    public static class Book {

    }

    @Test
    public void testBookXml() throws JsonProcessingException {
        XmlMapper mapper = new XmlMapper();
        mapper.configure(ToXmlGenerator.Feature.WRITE_XML_DECLARATION, true);

        System.out.println("Jackson\n" + mapper.writeValueAsString(new Book()) + "\n");

        StringWriter sw = new StringWriter();
        JAXB.marshal(new Book(), sw);
        System.out.println("JAXB\n" + sw.toString());
    }
}

输出结果如下:
Jackson
<?xml version='1.0' encoding='UTF-8'?><Book/>

JAXB
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<book/>

除了字符串操作之外,是否有一种方法可以使Jackson头与JAXB头类似?我不在意<Book/> vs <book/>


你解决了这个问题吗? - Bender
我最终只是在结果上进行了字符串替换。无法使用JAXB解决这个问题。 - PunDefeated
很遗憾听到这个消息,但感谢您的回复。 - Bender
2个回答

0
如果您想要与JaxB完全一样的效果,那么@gongxiansheng提供的解决方案可以起作用。
但是,如果您像我一样正在寻找带有双引号XML声明并且具有默认Woodstox依赖项的设置,则下面的设置就足够了:
    XmlMapper xmlMapper = new XmlMapper();
    xmlMapper.enable(SerializationFeature.INDENT_OUTPUT);  // for Pretty print or formatting
    xmlMapper.configure(ToXmlGenerator.Feature.WRITE_XML_DECLARATION, true);
    xmlMapper.getFactory().getXMLOutputFactory().setProperty(WstxOutputProperties.P_USE_DOUBLE_QUOTES_IN_XML_DECL, true);
    String reqXml = xmlMapper.writeValueAsString(new MyRequestDetail());

这将导致双引号 XML 声明:

<?xml version="1.0" encoding="UTF-8"?>

注意:更多配置信息可以在这篇优秀的文章中找到:配置Woodstox XML解析器:Woodstox特定属性


0

我遇到了同样的问题,通过重新加载类BufferingXmlWriter(从源代码中复制并修改一个方法)解决了这个问题,必须在使用Jackson生成XML之前进行重新加载。

  1. 创建包com.ctc.wstx.sw并创建类BufferingXmlWriter
  2. 从真实的com.ctc.wstx.sw.BufferingXmlWriter中复制源代码
  3. 修改方法writeXmlDeclaration(String version, String encoding, String standalone)
public void writeXmlDeclaration(String version, String encoding, String standalone)
            throws IOException
 {
       // final char chQuote = (mUseDoubleQuotesInXmlDecl ? '"' : '\'');
        final char chQuote = '"';
    
        fastWriteRaw("<?xml version=");
        fastWriteRaw(chQuote);
        fastWriteRaw(version);
        fastWriteRaw(chQuote);
    
        if (encoding != null && encoding.length() > 0) {
            fastWriteRaw(" encoding=");
            fastWriteRaw(chQuote);
            fastWriteRaw(encoding);
            fastWriteRaw(chQuote);
        }
        if (standalone == null) {
            fastWriteRaw(" standalone=");
            fastWriteRaw(chQuote);
            fastWriteRaw("yes");
            fastWriteRaw(chQuote);
        }
        fastWriteRaw('?', '>');
 }    

4. 重新加载
Class.forName("com.ctc.wstx.sw.BufferingXmlWriter");

5. 结果
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接