所以我一直在尝试按预订收集所有节点名称及其内容。所以我使用递归方法从XML文件中获取所有节点以及Text。问题是每当我执行它时,我继续在ArrayList中获取空字符串。由于没有文字,所以空的字符串就在学院,学院和部门旁边。
我尝试从ArrayList中删除空字符串和null,但没有工作,有没有人知道解决这个问题的方法,谢谢!
这是XML文件:
<?xml version="1.0"?>
<Academy>
<Faculty>
<Department name= "Science">
<Director>Kay Jordan</Director>
<Don>ABC</Don>
</Department>
</Faculty>
</Academy>
这是Java代码:
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerException;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class Gen2 {
static ArrayList<String> SLDP = new ArrayList<String>(0);
public static void main(String[] args) throws SAXException, IOException,
ParserConfigurationException, TransformerException {
DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory
.newInstance();
DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
Document document = docBuilder.parse(new File("Test.xml"));
doSomething(document.getDocumentElement());
System.out.print("< ");
SLDP.removeAll(Arrays.asList(null," "));
for(int z =0; z<SLDP.size();z++){
System.out.print(SLDP.get(z).toString()+ " ");
}
System.out.print(" >");
}
public static void doSomething(Node node) {
// do something with the current node instead of System.out
//System.out.println(node.getNodeName());
SLDP.add(node.getNodeName());
System.out.println(node.getFirstChild().getTextContent());
SLDP.add(node.getFirstChild().getTextContent());
NodeList nodeList = node.getChildNodes();
for (int i = 0; i < nodeList.getLength(); i++) {
Node currentNode = nodeList.item(i);
if (currentNode.getNodeType() == Node.ELEMENT_NODE) {
//calls this method for all the children which is Element
doSomething(currentNode);
}
}
}
}
答案 0 :(得分:2)
简单方法:在doSomething()
修剪节点名称和内容:
SLDP.add(node.getNodeName().trim());
//System.out.print(node.getFirstChild().getTextContent());
SLDP.add(node.getFirstChild().getTextContent().trim());
不太简单:将其添加到DocumentBuilderFactory
:
docBuilderFactory.setIgnoringElementContentWhitespace(true);
docBuilderFactory.setValidating(true);
docBuilderFactory.setSchema(...);
但是您需要xml文件的模式才能使解析器验证并删除不需要的空格。请参阅documentation here。
答案 1 :(得分:0)
XML中的每个新行都是子列表中的新TEXT_NODE。所以打电话:
SLDP.add(node.getFirstChild().getTextContent());
将导致向SLDP数组列表添加新行字符。
您可以通过正确配置DocumentBuilderFactory来阻止这种情况:
docBuilderFactory.setIgnoringElementContentWhitespace(true);