TransformerException:XPath中的未知错误

时间:2013-06-26 23:26:59

标签: java android dom xpath

我正在使用org.w3c.dom库将XML ElementsDocuments存储在我创建的Item类中。有时我需要使用setAttribute配置Elements以便以后解析(由.NET编写的服务器完成)。我最初使用JDOM,但由于XPath和selectSingleNode已被弃用,它不再具备我需要的功能。

我的变量声明为:

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db;
Document outDom = null;
db = dbf.newDocumentBuilder();
outDom = (Document) db.parse("<Empty/>");
Node fault_node = null;

错误来自以下行:

fault_node = (Node) xp.evaluate(Item.XPathFault, outDom, XPathConstants.NODE);

这是在另一个类而不是Item(HttpServerConnection,如果它很重要)但Item.XPathFault在Item中声明为

public static final String XPathFault = "/" + Soap.EnvelopeBodyFaultXPath;

Soap包含定义

static final String SoapEnvUri = "http://schemas.xmlsoap.org/soap/envelope/";
private static final String SoapNamespaceCheck = "namespace-uri()='" + SoapEnvUri + "' or namespace-uri()=''";
static final String EnvelopeXPath = "*[local-name()='Envelope' and (" + SoapNamespaceCheck + ")]";
static final String BodyXPath = "*[local-name()='Body' and (" + SoapNamespaceCheck + ")]";
static final String FaultXPath = "*[local-name()='Fault' and (" + SoapNamespaceCheck + ")]";
static final String EnvelopeBodyXPath = EnvelopeXPath + "/" + BodyXPath;
static final String EnvelopeBodyFaultXPath = EnvelopeBodyXPath + "/" + FaultXPath;

问题是当我在模拟器上运行程序时,我收到错误:

javax.xml.xpath.XPathExpressionException: javax.xml.transform.TransformerException: Unknown error in XPath.
    at org.apache.xpath.jaxp.XPathImpl.evaluate(XPathImpl.java:295)

我想要从XPath.evaluate函数中获取的是selectSingleNode,它在JDOM2中已弃用且在w3c.dom中不存在。虽然说实话,我不确定我是否使用了正确的功能。但我知道 错误来自哪里,但我无法弄明白为什么

编辑:我已经找到了答案

事实证明我的问题在于代码db.parse("<Empty/>");和其他类似的陈述。

我误解了parse的功能。传递String时,它假定String是要读取的XML文件的路径/位置。当我将实际的XML作为String传递给方法时,这会导致错误。如果parse传递InputStream,它会将流的内容读取为XML。

我通过更改

修复了我的程序
outDom = (Document) db.parse("<Empty/>");

到稍长的

InputStream is = new ByteArrayInputStream("<Empty />".getBytes());
Document outDom = (Document) builder.parse(is);

1 个答案:

答案 0 :(得分:0)

在JDOM中没有弃用XPath,你只需要使用不同的类:

  XPathFactory xpfac = XPathFactory.instance();
  XPathExpression<Element> xp = xpfac.compile("//title", Filters.element());
  List<Element> results = xp.evaluate(doc);

新课程用于支持泛型。