【问题标题】:Formatting XML file : Indentation格式化 XML 文件:缩进
【发布时间】:2011-06-18 13:33:23
【问题描述】:

我正在尝试编写具有适当缩进的 XML 文件。这是我的代码:

   public class WebVideo {

 private final String C_XMLFILEPATH = "resources/video.xml";
 private String itemId;
 private String videoPath;

 public WebVideo(long itemId, String videoPath) {
  this.itemId = Long.toString(itemId);
  this.videoPath = videoPath;
 }

 public void saveVideo() throws ParserConfigurationException, IOException,
   TransformerFactoryConfigurationError, TransformerException,
   SAXException {
  File xmlFile = new File(C_XMLFILEPATH);
  DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory
    .newInstance();
  DocumentBuilder documentBuilder = documentBuilderFactory
    .newDocumentBuilder();
  Document document = null;
  Element rootElement = null;

  if (xmlFile.exists()) {
   document = documentBuilder.parse(xmlFile);
   rootElement = document.getDocumentElement();

  } else {
   document = documentBuilder.newDocument();
   rootElement = document.createElement("Videos");
   document.appendChild(rootElement);
  }

  Element itemElement = document.createElement("Video");
  rootElement.appendChild(itemElement);

  Element idElement = document.createElement("Id");
  Text id = document.createTextNode(itemId);
  idElement.appendChild(id);
  itemElement.appendChild(idElement);

  Element pathElement = document.createElement("Path");
  Text path = document.createTextNode(videoPath);
  pathElement.appendChild(path);
  itemElement.appendChild(pathElement);

  Transformer transformer = TransformerFactory.newInstance()
    .newTransformer();
  transformer.setOutputProperty(OutputKeys.INDENT, "yes");
  transformer.setOutputProperty(
    "{http://xml.apache.org/xslt}indent-amount", "4");

  StreamResult streamResult = new StreamResult(new StringWriter());
  DOMSource domSource = new DOMSource(document);
  transformer.transform(domSource, streamResult);
  String xmlString = streamResult.getWriter().toString();

  BufferedWriter bufferedWriter = new BufferedWriter(
    new OutputStreamWriter(new FileOutputStream(xmlFile)));
  bufferedWriter.write(xmlString);
  bufferedWriter.flush();
  bufferedWriter.close();
 }
}

一切正常,但如果您仔细查看输出 XML 文件,当我添加新元素时会出现问题。输出 XML 文件在这里:

  <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <Videos>
        <Video>
            <Id>1</Id>
            <Path>path</Path>
        </Video>
    <Video>
            <Id>2</Id>
            <Path>path</Path>
        </Video>
    </Videos>

标签与标签在同一个缩进中。我怎么解决这个问题? 谢谢。

【问题讨论】:

标签: java xml dom


【解决方案1】:
public String formatXML(String input)
{
    try
    {
        final InputSource src = new InputSource(new StringReader(input));
        final Node document = DocumentBuilderFactory.newInstance()
                .newDocumentBuilder().parse(src).getDocumentElement();

        final DOMImplementationRegistry registry = DOMImplementationRegistry
                .newInstance();
        final DOMImplementationLS impl = (DOMImplementationLS) registry
                .getDOMImplementation("LS");
        final LSSerializer writer = impl.createLSSerializer();

        writer.getDomConfig().setParameter("format-pretty-print",
                Boolean.TRUE);
        writer.getDomConfig().setParameter("xml-declaration", true);

        return writer.writeToString(document);
    } catch (Exception e)
    {
        e.printStackTrace();
        return input;
    }
}

【讨论】:

    【解决方案2】:

    如果您想要更多自定义,您还可以创建自己的换行格式。在附加实际子项之前附加换行符文本:

    Text lineBreak = doc.createTextNode("\n\t");
    
    element.appendChild(lineBreak);
    

    【讨论】:

      【解决方案3】:

      一些 XML 库内置了漂亮的打印功能。例如 dom4j 有 OutputFormat.createPrettyPrint() - 请参阅http://dom4j.sourceforge.net/dom4j-1.6.1/guide.html#Writing_a_document_to_a_file 的使用指南

      【讨论】:

        【解决方案4】:

        检查这个答案以获得漂亮的 XML 打印:How to pretty print XML from Java?

        【讨论】:

        • 谢谢。我看到了那个线程,但只有 Transformer 的用法。解决了。​​
        猜你喜欢
        • 2021-05-10
        • 2018-07-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-13
        • 2016-08-26
        • 2011-10-30
        • 1970-01-01
        相关资源
        最近更新 更多