如何从 XML 文件中删除多余的空行?

新手上路,请多包涵

简而言之;我在一个 XML 文件中生成了许多空行,我正在寻找一种方法来删除它们,作为一种倾斜文件的方式。我怎样才能做到这一点 ?

详细解释;我目前有这个 XML 文件:

 <recent>
  <paths>
    <path>path1</path>
    <path>path2</path>
    <path>path3</path>
    <path>path4</path>
  </paths>
</recent>

我使用此 Java 代码删除所有标签,然后添加新标签:

 public void savePaths( String recentFilePath ) {
    ArrayList<String> newPaths = getNewRecentPaths();
    Document recentDomObject = getXMLFile( recentFilePath );  // Get the <recent> element.
    NodeList pathNodes = recentDomObject.getElementsByTagName( "path" );   // Get all <path> nodes.

    //1. Remove all old path nodes :
        for ( int i = pathNodes.getLength() - 1; i >= 0; i-- ) {
            Element pathNode = (Element)pathNodes.item( i );
            pathNode.getParentNode().removeChild( pathNode );
        }

    //2. Save all new paths :
        Element pathsElement = (Element)recentDomObject.getElementsByTagName( "paths" ).item( 0 );   // Get the first <paths> node.

        for( String newPath: newPaths ) {
            Element newPathElement = recentDomObject.createElement( "path" );
            newPathElement.setTextContent( newPath );
            pathsElement.appendChild( newPathElement );
        }

    //3. Save the XML changes :
        saveXMLFile( recentFilePath, recentDomObject );
}

多次执行此方法后,我得到了一个具有正确结果的 XML 文件,但在“路径”标记之后和第一个“路径”标记之前有许多空行,如下所示:

 <recent>
  <paths>

    <path>path5</path>
    <path>path6</path>
    <path>path7</path>
  </paths>
</recent>

任何人都知道如何解决这个问题?

------------------------------------------ 编辑:添加 getXMLFile(. ..), saveXMLFile(…) 代码。

 public Document getXMLFile( String filePath ) {
    File xmlFile = new File( filePath );

    try {
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document domObject = db.parse( xmlFile );
        domObject.getDocumentElement().normalize();

        return domObject;
    } catch (Exception e) {
        e.printStackTrace();
    }

    return null;
}

public void saveXMLFile( String filePath, Document domObject ) {
    File xmlOutputFile = null;
    FileOutputStream fos = null;

    try {
        xmlOutputFile = new File( filePath );
        fos = new FileOutputStream( xmlOutputFile );
        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        transformer.setOutputProperty( OutputKeys.INDENT, "yes" );
        transformer.setOutputProperty( "{http://xml.apache.org/xslt}indent-amount", "2" );
        DOMSource xmlSource = new DOMSource( domObject );
        StreamResult xmlResult = new StreamResult( fos );
        transformer.transform( xmlSource, xmlResult );  // Save the XML file.
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (TransformerConfigurationException e) {
        e.printStackTrace();
    } catch (TransformerException e) {
        e.printStackTrace();
    } finally {
        if (fos != null)
            try {
                fos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
    }
}

原文由 Brad 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

在删除所有旧的“路径”节点后,我能够通过使用此代码来修复此问题:

 while( pathsElement.hasChildNodes() )
    pathsElement.removeChild( pathsElement.getFirstChild() );

这将删除 XML 文件中所有生成的空白区域。

特别感谢 MadProgrammer 使用上面提到的有用链接发表评论。

原文由 Brad 发布,翻译遵循 CC BY-SA 3.0 许可协议

首先,解释为什么会发生这种情况——这可能有点偏离,因为您没有包含用于将 XML 文件加载到 DOM 对象中的代码。

根据 DOM 规范,当您从文件中读取 XML 文档时,标签之间的空格实际上构成了有效的 DOM 节点。因此,XML 解析器将每个这样的空白序列视为一个 DOM 节点(类型为 TEXT );

为了摆脱它,我可以想到三种方法:

  • 将 XML 与架构相关联,然后在 setIgnoringElementContentWhitespace(true) 上使用 setValidating(true) 以及 DocumentBuilderFactory

(注意: setIgnoringElementContentWhitespace 仅在解析器处于验证模式时才有效,这就是为什么你必须使用 setValidating(true)

  • 编写一个 XSL 来处理所有节点,过滤掉只有空白的 TEXT 节点。
  • 使用 Java 代码执行此操作:使用 XPath 查找所有仅空白 TEXT 节点,遍历它们并从其父节点中删除每个节点(使用 getParentNode().removeChild() )。这样的事情会做( doc 将是您的 DOM 文档对象):
   XPath xp = XPathFactory.newInstance().newXPath();
  NodeList nl = (NodeList) xp.evaluate("//text()[normalize-space(.)='']", doc, XPathConstants.NODESET);

  for (int i=0; i < nl.getLength(); ++i) {
      Node node = nl.item(i);
      node.getParentNode().removeChild(node);
  }

原文由 Isaac 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏