Java TransformerException:XPath中存在未知错误

Java TransformerException:XPath中存在未知错误,java,android,dom,xpath,Java,Android,Dom,Xpath,我正在使用org.w3c.dom库将XML元素和文档存储在我创建的项目类中。有时我需要使用setAttribute来配置元素,以便以后进行解析(由.NET中编写的服务器完成)。我最初使用的是JDOM,但由于XPath和selectSingleNode被弃用,它不再具有我需要的功能 我的变量声明为: DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db; Document outD

我正在使用
org.w3c.dom
库将XML
元素
文档
存储在我创建的项目类中。有时我需要使用
setAttribute
来配置
元素
,以便以后进行解析(由.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;
这在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(“”)
和其他类似语句

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

我修改了我的程序

outDom = (Document) db.parse("<Empty/>");
outDom=(Document)db.parse(“”);
稍微长一点

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

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

  XPathFactory xpfac = XPathFactory.instance();
  XPathExpression<Element> xp = xpfac.compile("//title", Filters.element());
  List<Element> results = xp.evaluate(doc);
XPathFactory xpfac=XPathFactory.instance();
XPathExpression xp=xpfac.compile(“//title”,Filters.element());
列表结果=xp.评估(doc);

新类是用来支持泛型的。

在所有连接发生之后,您是否尝试过检查XPathFault的值?也许这会提供一些细节。XPathFault返回为
/*[local-name()='Envelope'和(namespace-uri()='http://schemas.xmlsoap.org/soap/envelope/'或名称空间uri='')/*[local-name()='Body'和(名称空间-uri()='http://schemas.xmlsoap.org/soap/envelope/'或名称空间uri='')/*[local-name()='Fault'和(名称空间-uri()='http://schemas.xmlsoap.org/soap/envelope'或namespace-uri()='')
我想做的是一个selectSingleNode操作,但该函数在JDOM中不受欢迎,在w3DOM中不存在。
  XPathFactory xpfac = XPathFactory.instance();
  XPathExpression<Element> xp = xpfac.compile("//title", Filters.element());
  List<Element> results = xp.evaluate(doc);