当前位置: 首页 > 知识库问答 >
问题:

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

毕宇
2023-03-14

简言之我在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文件,但在“paths”标记之后和第一个“path”标记之前有许多空行,如下所示:

<recent>
  <paths>





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

有人知道怎么解决吗?

------------------------------------------- 编辑:添加getXMLFile(...),保存XMLFile(...)代码。

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();
            }
    }
}

共有3个答案

羊和光
2023-03-14

如果只需要快速“清理”xml,就可以看到类似的情况。然后您可以使用如下方法:

public static String cleanUp(String xml) {
    final StringReader reader = new StringReader(xml.trim());
    final StringWriter writer = new StringWriter();
    try {
        XmlUtil.prettyFormat(reader, writer);
        return writer.toString();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return xml.trim();
}

此外,要比较anche check差异,如果需要的话:XMLUnit

鞠鸿雪
2023-03-14

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

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

这将删除XML文件中生成的所有空格。

特别感谢Mad程序员通过上面提到的有用链接发表评论。

越正阳
2023-03-14

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

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

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

>

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

    (注意:setIgnoringElementContentWhitesspace仅在解析器处于验证模式时才会工作,这就是为什么您必须使用setValidating(true)

    使用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);
    }
    

  •  类似资料:
    • 问题内容: 简而言之; 我在XML文件中生成了许多空行,并且我正在寻找一种删除它们的方法,以作为倾斜文件的一种方法。我怎样才能做到这一点 ? 详细说明;我目前有这个XML文件: 我使用此Java代码删除所有标签,并添加新标签: 在多次执行此方法后,我得到了一个XML文件,其结果正确,但是在“ paths”标记之后和第一个“ path”标记之前有许多空行,如下所示: 有人知道该如何解决吗? ----

    • 问题内容: 我想知道如何删除: 所有 前导/尾随 空格或换行符,空字符等。 字符串中的任何多余空格(例如,“ hello [space] [space] world”将转换为“ hello [space] world”) 单个正则表达式,对国际空格字符的unicode支持等是否可行? 问题答案: 似乎您可能希望同时使用速记字符类和Unicode属性来匹配Unicode空间。但是,这两个步骤都不能用

    • 问题内容: 我从数据库查询中接收到一个字符串,然后在将其放入CSV文件之前,删除了所有HTML标记,回车符和换行符。唯一的事情是,我找不到从字符串 之间 删除 多余的 空白的方法。 __ 删除内部空白字符的最佳方法是什么? 问题答案: 不确定确切要什么,但是有两种情况: 如果你只是处理过剩上,你可以使用字符串的开头或结尾,或者将其删除。 如果你正在处理一个字符串中多余的空格考虑多 用单 。 例:

    • 所以我正在做的是,我正在从XML中查找并删除一些标签。删除后,这些标签会被空格替换,这实际上不会影响XML,但当我删除大量标签时会引起问题。 有什么可行的方法来实现这一点吗? 提前感谢。 这是我在这里找到的答案的链接,但它不起作用

    • 问题内容: 我需要有关从UTF-8文件删除BOM并创建其余xml文件的副本的方法的建议。 问题答案: 有因为在UTF-8文件中的BOM的工具断裂是一个 非常 以我的经验平常的事。我不知道为什么会有这么多的否决票(但是这给了我机会去尝试赢得足够的选票来赢得特殊的SO徽章;) 更严重的是:UTF-8 BOM通常没有太大意义, 但 在规格上完全有效(尽管不建议使用)。现在的问题是,很多人不知道BOM在U

    • 问题内容: 我有以下名为“ data.csv”的文件: 我想将其解析为一个熊猫DataFrame,以便DataFrame如下所示: 我能做的最好的事情是: 这让我: 没有这些空格的如何获取DataFrame? 问题答案: 您可以使用转换器: 产量