使用getTextContent()时数组列表中的空字符串

时间:2015-02-25 22:27:03

标签: java xml arraylist

所以我一直在尝试按预订收集所有节点名称及其内容。所以我使用递归方法从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);
            }
        }
    }
}

2 个答案:

答案 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);