gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 22:51:47 24 4
gpt4 key购买 nike

简而言之;我在一个 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();
}
}
}

最佳答案

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

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

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

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

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

关于java - 如何从 XML 文件中删除多余的空行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12669686/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com