解析XML会在Java中返回错误的子项数

时间:2013-12-03 07:58:02

标签: java xml parsing dom

我正在解析一个非常简单的XML文件,但我遇到的问题是当我返回子项数时。

我的XML文件:

<?xml version="1.1" encoding="ISO-8859-1"?>
    <Sensors>
        <Sensor ID="1">
            <Path>C:\Test\s1</Path>
        </Sensor>
        <Sensor ID="2">
            <Path>C:\Test\s2</Path>
        </Sensor>
        <Sensor ID="3">
            <Path>C:\Test\s3</Path>
        </Sensor>
    </Sensors>

我的Java代码是这样的:

private void checkSensors()
    {
        String name = "C:\\Test\\sensors.xml";
        File fileName = new File(name);

        if (!fileName.exists())
        {
            System.out.println("File doesn't Exists!!!!!");
        }
        else
        {
            System.out.println("File Exists, moving on..");
            sensorDoc = getDocument(name);

            int count = 0;
            Element root = sensorDoc.getDocumentElement();
            Node sensor = root.getFirstChild();

            while (sensor != null)
            {
                count++;
                sensor = sensor.getNextSibling();
            }

            System.out.println("There are: " + count + " sensors.");
        }
    }

    private static Document getDocument(String name)    
    {
        try
        {
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

            factory.setIgnoringComments(true);
            factory.setIgnoringElementContentWhitespace(true);
            factory.setValidating(true);


            DocumentBuilder builder = factory.newDocumentBuilder();
            builder.setErrorHandler(null);
            System.out.println("Parsing...");
            return builder.parse(new InputSource(name));
        }
        catch (Exception e)
        {
            return null;
        }
    }

输出结果是

"There are: 7 sensors."

虽然应该说

"There are: 3 sensors."

我已经尝试删除空白区域,因为我在很多关于空白的帖子中都读到过,但这并没有改变任何东西,我也尝试删除XML文档中其中一个传感器的属性,但这也没有改变任何东西。

我也尝试使用NodeList,然后输出getLength(),但也没有返回正确数量的传感器。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

你试过了吗?

NodeList entities = sensorDoc.getElementsByTagName("Sensor");
System.out.println("There are: " + entities.getLength()+ " sensors.");

输出是什么?

答案 1 :(得分:0)

getNextSibling返回紧跟此节点后的节点。这也意味着子节点Path。因此,你有更多的项目。