【问题标题】:XPath works standalone, but does not work when put in a web appXPath 独立工作,但放在 Web 应用程序中时不起作用
【发布时间】:2014-09-27 11:27:47
【问题描述】:

我正在寻找解析 XML,在 xpath 表达式的帮助下,我想引入节点名称为 AuditRecord 的所有节点值。令人惊讶的是,我可以在独立的应用程序中执行此操作,但相同的代码在应用程序中失败。我什至没有更改 XML。我在独立应用程序和 Web 应用程序中使用相同的 XML 文件我可以在独立应用程序中看到结果,但是当我在 Web 应用程序中尝试相同的事情时,我得到 0 节点列表大小。

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale; 
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;


public class TestXmlNode {
private static final String TEST_XML = "C:/test.xml";
public static void main(String[] args) throws ParseException {
    try {
        //XPath xPath =  XPathFactory.newInstance().newXPath();
        /*System.out.println("*************************");
        String expression = "//AuditRecord/DateTimeStamp";;
        System.out.println("*************************");
        System.out.println(expression);
        NodeList nodeList = (NodeList) xPath.compile(expression).evaluate(xmlDocument,     XPathConstants.NODESET);
        System.out.println("Nodelist size"+nodeList.getLength());
        for (int i = 0; i < nodeList.getLength(); i++) {
            String date = nodeList.item(i).getFirstChild().getNodeValue();
          System.out.println("Date after split     "+date.split("T")[0]);
            Date thedate = convertStringToDate(date);
            Date  todate = convertStringToDate("2014-01-01"); 
            System.out.println("XML todate"+todate.toString()); 
        if(thedate.after(todate))
            System.out.println("-------------------------->"+ thedate.toString());
        }*/
        FileInputStream file = new FileInputStream(new File(TEST_XML));
      DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
      DocumentBuilder builder =  builderFactory.newDocumentBuilder();
      org.w3c.dom.Document xmlDocument = builder.parse(file);
      XPathFactory xPathFactory = XPathFactory.newInstance();
      XPath xpath = xPathFactory.newXPath();
      XPathExpression xPathExpr = xpath.compile("//AuditRecord/DateTimeStamp/text()");
      Object result = xPathExpr.evaluate(xmlDocument, XPathConstants.NODESET);
      print(result);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (SAXException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (ParserConfigurationException e) {
        e.printStackTrace();
    } catch (XPathExpressionException e) {
        e.printStackTrace();
    }       
}   
public static void print(Object result){
NodeList nodes = (NodeList) result;
for (int i = 0; i < nodes.getLength(); i++) {
  System.out.println(i+" "+nodes.item(i).getNodeValue());
}
}

}

【问题讨论】:

  • 您的网络设置是否使用相同的 jar?
  • 从 XML 解析我正在使用 JAVAX 类。我不需要特殊的罐子来做

标签: java xml xpath expression


【解决方案1】:

您的网络应用程序可能无法访问 C:/test.xml,因为网络应用程序通常不允许直接访问文件系统。

【讨论】:

  • 我应该得到文件未找到异常,此外,我已将 XML 内容转换为字符串以查看 XML 的内容。我也可以看到内容
  • 不一定。尝试为 Exception 添加一个 catch 块,看看发生了什么。
  • 没有进入异常块
【解决方案2】:

类路径中存在 xmlparserv-2.0.jar 是个问题,它不允许应用 xpath 表达式。关于如何继续前进的任何想法

【讨论】:

  • 问题在于命名空间前缀,因为默认命名空间没有前缀,这是它不应用 xpath 过滤器的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-17
  • 1970-01-01
  • 2020-05-11
相关资源
最近更新 更多