在java

时间:2015-11-10 15:50:24

标签: java xml jaxb

TL; DR;当我将xml文件解组为对象时,我需要在CDATA中保留新行。

我有一个xml文件(例如):

<xmlTag>
       <![CDATA[<someXml>This content
                     is formatted</someXml>]]    
</xmlTag>

我使用此代码将其转换为命名空间的对象(Filter和SAXSource只是因为输入xml没有命名空间,但生成的Class T确实如此):

public static <T> T transformFileToObject(File file, Class<T> clazz, XMLFilter filter) throws .. {
    JAXBContext jc = JAXBContext.newInstance(clazz);
    XMLReader reader = XMLReaderFactory.createXMLReader();
    if (filter != null) { 
        filter.setParent(reader);
    }

    InputSource is = new InputSource(new FileInputStream(input));
    SAXSource source = new SAXSource(filter, is);

    Unmarshaller unmarshaller = jc.createUnmarshaller();
    return (T) unmarshaller.unmarshal(source);
}

我的问题是,当我调用它时,我的xml被解析得很好。我得到一个看起来像这样的对象:

class XmlTag {
    private String someXml = "This content is formatted";
}

这就是问题所在。字符串未格式化。从编组的角度来看,我已经看过很多这方面的讨论了,但我还没有看到任何相关的事情。

我已尝试设置编码以保留换行符,但它似乎无法正常工作。

我认为我可以制作一个黑客,将\ r \ n中的换行符交换到SOME_RESERVED_STRING并稍后在属性中交换它,但在我的用例中,可能有几个someXml实例,意味着我必须做丑陋的字符串操作。

TL; DR;当我将xml文件解组为对象时,我需要在CDATA中保留新行。

2 个答案:

答案 0 :(得分:0)

根据http://www.w3.org/TR/2000/REC-xml-20001006#sec-line-ends,似乎不同的新行字符与标准新行字符均匀。 您是否有任何理由需要使用\r\n而不仅仅是\n

答案 1 :(得分:0)

原来定义的xsd存在问题,因为它被定义为xsd:normalizedString,而不是xsd:string。

所以基本上我所做的任何事情都被该适配器无效。它在CDATA中开箱即用。