builder.parse((new StringReader(xml))返回DeferredDocumentImpl
我想了解我可以做出什么错误,但找不到解决方案。
public static Document getXMLFromString(String xml) {
org.w3c.dom.Document doc = null;
try {
DocumentBuilderFactory factory = DocumentBuilderFactory
.newInstance();
factory.setNamespaceAware(true);
DocumentBuilder builder;
builder = factory.newDocumentBuilder();
doc = (org.w3c.dom.Document) builder.parse(new InputSource(
new StringReader(xml)));
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ParserConfigurationException e) {
e.printStackTrace();
}
return doc;
}我没有导入org.w3c.dom.Document
我在这里调用这个方法:
private Node getAuthToken(SOAPMessage responseAuth) throws SOAPException,
TransformerException, ParserConfigurationException, IOException,
SAXException {
String s = indentXML(responseAuth.getSOAPPart().getContent());
Document doc = getXMLFromString(s);
NodeList authTokenNodeList = doc.getElementsByTagName("authToken");
return authTokenNodeList.item(0);
}
NodeList是空的。
在Web上进行研究后,每个人都使用此代码将字符串解析为Document。 我没有任何异常,但调用方法parse()后,doc的值被设置为[#document:null] DeferredDocumentImpl。
我正在使用org.w3c.dom中的所有内容。
xml是一个包含的字符串
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<context xmlns="urn:zimbra">
<session id="36" type="admin">36</session>
<change token="251"/>
</context>
</soap:Header>
<soap:Body>
<AuthResponse xmlns="urn:zimbraAdmin">
<authToken>...</authToken>
<lifetime>...</lifetime>
<a n="zimbraIsDomainAdminAccount">false</a>
<session id="36" type="admin">36</session>
</AuthResponse>
</soap:Body>
</soap:Envelope>
这是我在SOAP调用之后如何构建字符串:
String xml = indentXML(responseAuth.getSOAPPart().getContent());
我究竟做错了什么?
这是我想以一种简单的方式来做的:
StringBuilder soapResponse = new StringBuilder(...
...
...
);
org.w3c.dom.Document doc = null;
try {
DocumentBuilderFactory factory = DocumentBuilderFactory
.newInstance();
factory.setNamespaceAware(true);
DocumentBuilder builder;
builder = factory.newDocumentBuilder();
doc = (org.w3c.dom.Document) builder.parse(new InputSource(
new StringReader(soapResponse.toString())));
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ParserConfigurationException e) {
e.printStackTrace();
}
NodeList authTokenNodeList = doc.getElementsByTagName("authToken");
Node n = authTokenNodeList.item(0);
String s = n.getNodeValue();编辑:看你的更新代码,我认为这是问题:
String s = n.getNodeValue();
如果您查看Node的文档,您会看到getNodeValue()被定义为元素返回null ...因此是问题所在。 我的示例代码使用getTextContent()代替,它工作正常。
看起来这只是推迟扩展的内存中的对象,直到他们需要。
你有没有尝试在返回的文档上调用方法,而不仅仅是查看调试器? 我怀疑一切都是按照预期工作的。 如果没有,请发布一个简短但完整的程序,显示它行为不端。 (请注意,样本中你给了,你还没有显示如何builder设置的,你没有使用factory 。)
编辑:你给的代码适合我。 这是一个快速而又脏的 - 但重要的是,完整的程序(使用Guava将XML文件加载到一个字符串中),它显示了成功找到的节点:
import org.w3c.dom.*;
import org.xml.sax.*;
import java.text.*;
import java.util.*;
import javax.xml.parsers.*;
import java.io.*;
import com.google.common.base.*;
import com.google.common.io.*;
public class Test {
public static void main(String[] args) throws Exception {
String xml = Files.toString(new File("test.xml"), Charsets.UTF_8);
Node node = getAuthToken(xml);
System.out.println(node.getTextContent());
}
private static Node getAuthToken(String xml) throws Exception {
Document doc = getXMLFromString(xml);
NodeList authTokenNodeList = doc.getElementsByTagName("authToken");
return authTokenNodeList.item(0);
}
public static Document getXMLFromString(String xml) throws Exception {
Document doc = null;
DocumentBuilderFactory factory = DocumentBuilderFactory
.newInstance();
factory.setNamespaceAware(true);
DocumentBuilder builder;
builder = factory.newDocumentBuilder();
doc = builder.parse(new InputSource(new StringReader(xml)));
return doc;
}
}
链接地址: http://www.djcxy.com/p/34927.html
上一篇: builder.parse((new StringReader(xml)) returns DeferredDocumentImpl
下一篇: java SAX parser giving NullPointerException after change in working code
