如果我想在Javaservlet中解析xml文件,我应该在哪里找到它

如果我想在Javaservlet中解析xml文件,我应该在哪里找到它,java,xml,servlets,Java,Xml,Servlets,我想在servlet中解析xml文件,但出现了一个异常,JVM无法指定xml文件位置 这是个例外 java.io.FileNotFoundException: FormFieldsNames.xml (The system cannot find the file specified) 我试图将xml文件放在项目方向、JavaSRC包和servlet包中,但所有这些尝试都得到了相同的结果 我应该在哪里找到xml文件,请提前帮助和感谢 如果您将其包含在jar/war文件中,您应该能够使用Clas

我想在servlet中解析xml文件,但出现了一个异常,JVM无法指定xml文件位置

这是个例外

java.io.FileNotFoundException: FormFieldsNames.xml (The system cannot find the file specified)
我试图将xml文件放在项目方向、JavaSRC包和servlet包中,但所有这些尝试都得到了相同的结果


我应该在哪里找到xml文件,请提前帮助和感谢

如果您将其包含在jar/war文件中,您应该能够使用
Class.getResourceAsStream
ClassLoader.getResourceAsStream
轻松加载它。这样做,而不是试图将其作为实际文件加载到文件系统中。

通常的位置是:

  • WEB-INF/
    -由
    getServletContext()获取。getResourceAsStream(..)
  • WEB-INF/classes
    -通过上述或
    getClass()获取。getResourceAsStream(..)

从类路径读取文件的一个常见问题是在WAR文件中获得正确的位置

在Java中,一个名为MyServlet的servlet可以像这样引用该文件

InputStream is=MyServlet.getClass().getResourceAsStream("/path/to/file/example.txt")
它将查找存储在下的文件

WEB-INF/classes/path/to/file/example.txt
注意引导语/引导语,它经常吸引人

应用程序容器可以从本地文件系统读取数据(例如,如果您想获得外部属性,而不想使用JNDI)。为此,您将使用通常的文件访问过程:

InputStream fis = FileInputStream(new File("/usr/share/myapp/another-example.txt"));
当然,如果您想将DOM指向它,那么MyServlet可以包含以下内容:

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = dbf.newDocumentBuilder();
InputStream is = MyServlet.getClass().getResourceAsStream("/path/to/my/example.xml");
Document document = documentBuilder.parse(new InputSource(is));
// And start exploring the NodeList...
NodeList nodeList = document.getFirstChild().getChildNodes();

这应该可以奏效。

@Bozho-我尝试了这两种方法,但我使用了XMLStreamReader=factory.createXMLStreamReader(新文件阅读器(文件名));读取XML文件,然后通过STAX处理它,但同样的异常@Alaa-您正在传递一个文件名。我从来没有写过这样的东西。我写了如何获得
InputStream
。您可以通过
InputStreamReader
从Stream获取读卡器。使用它。@Bozho-我将InputSream作为参数传递,但我认为传递文件名可能更有用!!你觉得怎么样?@Alaa-对谁有用?传递输入流被广泛使用。请记住,war文件可能在未爆炸的情况下运行-那么您没有物理文件。@Bozho-war文件在web组件中包含xml文件,那么“那么您没有物理文件”是什么意思??xml将在哪里加载?关于输入流,我知道读取任何文件并将其加载到内存中都是对象?所以你的意思是我最好让对象兑现吗?@Gray Rowe-如果我不想从servlet生成对象呢???如何使用这个MyServlet.getClass().getResourceAsStream(“/path/to/my/example.xml”)@Alaa上述方法适用于任何类别。您的servlet可以只调用处理查找的类的实例,只需用适当的类名替换MyServlet即可。如果可以,我需要指定servlet中的xml位置,以便使用:InputStream fis=this.getClass().getResourceAsStream(“/FormFieldsNames.xml”);许多thanxit struts
getClass().getResourceAsStream(文件名)为我工作。因此,如果文件在项目中,我不能直接创建InputStream。是否有一些概念上的解释?@saifan是一个抽象类。通常,您依赖工厂方法来创建实现。