【问题标题】:Cannot work with XML file. InputStream is null无法使用 XML 文件。输入流为空
【发布时间】:2014-07-22 17:14:26
【问题描述】:

我在这里做错了什么?我收到错误,如果不是这种情况,输入流中没有任何内容。该文件在那里,并且标题正确。我想获取我放在 XML 文件中的 IP 地址。有没有更好的方法来解析文件而不是dBuilder.parse(XMLReader.class.getResourceAsStream("C:\\Tools\\CLA\\test.xml"));

我遇到了这个异常:

Caused by: java.lang.IllegalArgumentException: InputStream cannot be null
    at javax.xml.parsers.DocumentBuilder.parse(Unknown Source)
    at com.Intel.ameier.XMLparser.TryXML(XMLparser.java:17)

代码如下:

import java.io.IOException;
import org.xml.sax.*;
import org.w3c.dom.*;
import javax.xml.parsers.*;

public class XMLparser {

    protected void TryXML() throws ParserConfigurationException, SAXException, IOException{

        DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();

        DocumentBuilder dBuilder = builderFactory.newDocumentBuilder();
        Document document = dBuilder.parse(XMLReader.class.getResourceAsStream("C:\\Tools\\test.xml"));
        document.normalize();

        NodeList rootNodes = document.getElementsByTagName("info");
        Node rootNode = rootNodes.item(0);
        Element rootElement = (Element)rootNode;
        NodeList compList = rootElement.getElementsByTagName("computer");
        for(int i = 0;i < compList.getLength(); i++){

            Node computer = compList.item(i);
            Element compElement = (Element)computer;

            Node theIP = compElement.getElementsByTagName("ipaddress").item(0);
            Element theIpElement = (Element)theIP;

            System.out.println("The comptuer ip is : " + theIpElement.getTextContent());


        }


    }


}

XML 文件:

<?xml version="1.0"?>
<info>
    <testsuite>
        <name></name>
    </testsuite>
    <computer>
        <ipaddress>111.11.11.6</ipaddress>
    </computer>
    <computer>
        <ipaddress>111.11.11.5</ipaddress>
    </computer>
    <computer>
        <ipaddress>111.11.11.3</ipaddress>
    </computer>
</info>

【问题讨论】:

    标签: java xml inputstream


    【解决方案1】:

    确实和XML无关,Jon的回答很满意。

    但是,解释是不准确的。可以使用Class.getResourceAsStream 加载任意文件。在某些情况下,Class.getResourceAsStream 是加载资源的首选方式。

    这里的问题是Class.getResourceAsStream() 将其参数解释为相对于类路径中的每个路径,并且不理解此处传递的绝对路径。它只能“看到”类路径中的文件。

    您可以尝试将C:\Tools\CLA 添加到您的类路径,然后使用

    getResourceAsStream("/test.xml");
    

    【讨论】:

      【解决方案2】:

      这与 XML 无关。您正在使用Class.getResourceAsStream,它的目的是从该类的类加载器的类路径中获取要加载的资源...但是您正在传递一个文件名

      如果要为文件创建输入流,只需使用FileInputStream

      Document document = dBuilder.parse(new FileInputStream("C:\\Tools\\test.xml"));
      

      或者更好,为了关闭流:

      Document document:
      
      try (InputStream stream = new FileInputStream("C:\\Tools\\test.xml")) {
          document = dBuilder.parse(stream);
      }
      

      【讨论】:

      • 谢谢。 Youtube(我从那里得到这个信息)非常适合学习,但它只会让你走这么远......
      • 谢谢,正是我想要的。
      猜你喜欢
      • 2011-01-25
      • 1970-01-01
      • 2013-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多