【问题标题】:Preserve newline in xml while using builder.parse method & Transformer使用 builder.parse 方法和 Transformer 时在 xml 中保留换行符
【发布时间】:2015-01-12 19:14:05
【问题描述】:

目标是读取 xml 文件并写入新的 xml 文件,同时保留换行符。我们需要 Document 对象来执行其他 xml 任务。

说source.xml看起来像这样:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <Code><![CDATA[code line1
code line 2
code line 3

code line 4]]></Code>

现在目标应该与代码元素中的换行符看起来相同。但相反,它会忽略换行符并将其变为一行。

对于写作,我使用的是下面的方法:

public static void writeFile(Document xml, File writeTo)
    {
        try
        {
            TransformerFactory transformerFactory = TransformerFactory.newInstance();
            Transformer transformer = transformerFactory.newTransformer();
            transformer.setOutputProperty(OutputKeys.INDENT, "yes");
            transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); 
            DOMSource source = new DOMSource(xml);
            StreamResult result = new StreamResult(writeTo);
            transformer.transform(source, result);
        }
        catch(TransformerException e)
        {
            System.out.println("Couldn't write file " + writeTo);
            e.printStackTrace();
        }
    }

Document xml 是使用 DocumentBuilder 中的 Parse(File) 方法获得的。大致如下:

File file; // a list of files is recursively obtained from a given folder.

DocumentBuilderFactory documentBuilderfactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = documentBuilderfactory.newDocumentBuilder();
Document xml = builder.parse(file);

builder.parse 似乎丢失了 Code 元素的 CDATA 中的换行符。

我们如何保留换行符? 我是 Java API 的新手。

【问题讨论】:

  • 如何获取Document 对象?你能发布创建它的代码并将其传递给writeFile吗?
  • 是否有理由需要将其作为 XML 而不是纯文本来阅读?如果你不需要把它当成XML,你应该可以直接读取。
  • @manouti 我用如何获取 Document 对象更新了问题。
  • @BrianJ 没有特别的原因,使用它,因为这是我在网上找到的。我是 Java API 新手。
  • @dushyantp 我尝试使用裸代码和输入 XML 重现问题,但不能:我复制了问题中看起来的 XML,它在输出中保持不变,除了一个删除了元素名称之前的小缩进。是否使用了 XSLT 文件?为什么文件只是按原样复制?也许我在问题中遗漏了一些东西。

标签: java xml javax.xml


【解决方案1】:

当我把你的 sn-ps 放在一起时,我得到了这个程序:

public class TestNewLine {

    public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException, TransformerException {
        DocumentBuilderFactory documentBuilderfactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = documentBuilderfactory.newDocumentBuilder();
        Document xml = builder.parse(TestNewLine.class.getResourceAsStream("data.xml"));
        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        transformer.setOutputProperty(OutputKeys.INDENT, "yes");
        transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
        DOMSource source = new DOMSource(xml);
        StreamResult result = new StreamResult(System.out);
        transformer.transform(source, result);
    }
}

然后打印出来:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Code><![CDATA[code line1
code line 2
code line 3

code line 4]]></Code>

据我了解,换行符已被保留。你期望的输出是什么?

【讨论】:

  • 抱歉,检查后发现我问错了问题。由于 DocumentBuilder 解析方法,CDATA 中的换行符会丢失。写入即转换方法很好。我将修改问题并检查我们是否可以找到解决方案。
猜你喜欢
  • 1970-01-01
  • 2011-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多