Java parse((新的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; } 公共静态文档getXMLFromString(字符串xml){ org.w3c.dom.Document doc=null; 试一试{ DocumentBuilderFactory工厂=DocumentBuilderFactory .newInstance(); factory.setNamespaceAware(true); 文档生成器; builder=factory.newDocumentBuilder(); doc=(org.w3c.dom.Document)builder.parse(新输入源( 新的StringReader(xml)); }捕获(SAXE异常){ e、 printStackTrace(); }捕获(IOE异常){ e、 printStackTrace(); }捕获(ParserConfiguration异常e){ e、 printStackTrace(); } 退货单; } 我确实导入了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); } 私有节点getAuthToken(SOAPMessage responseAuth)引发SOAPException, TransformerException、ParserConfiguration异常、IOException、, 萨克斯例外{ 字符串s=indentXML(responseAuth.getSOAPPart().getContent()); 文档文档=getXMLFromString; NodeList authTokenNodeList=doc.getElementsByTagName(“authToken”); 返回authTokenNodeList.item(0); } 节点列表是空的 在web上研究之后,每个人都使用此代码将字符串解析为文档。我没有任何异常,但在调用parse()方法后,doc的值设置为[#Document:null]DeferredDocumentImpl 我正在使用org.w3c.dom中的所有内容 xml是一个包含Java parse((新的StringReader(xml))返回DeferredDocumentImpl,java,Java,我试图理解我可能犯了什么错误,但却找不到解决办法 public static Document getXMLFromString(String xml) { org.w3c.dom.Document doc = null; try { DocumentBuilderFactory factory = DocumentBuilderFactory .newInstance();
<?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>
36
...
...
假的
36
下面是我在SOAP调用后如何构建字符串:
String xml = indentXML(responseAuth.getSOAPPart().getContent());
字符串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();
StringBuilder soapResponse=新的StringBuilder(。。。
...
...
);
org.w3c.dom.Document doc=null;
试一试{
DocumentBuilderFactory工厂=DocumentBuilderFactory
.newInstance();
factory.setNamespaceAware(true);
文档生成器;
builder=factory.newDocumentBuilder();
doc=(org.w3c.dom.Document)builder.parse(新输入源(
新的StringReader(soapResponse.toString());
}捕获(SAXE异常){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}捕获(ParserConfiguration异常e){
e、 printStackTrace();
}
NodeList authTokenNodeList=doc.getElementsByTagName(“authToken”);
节点n=authTokenNodeList.item(0);
String s=n.getNodeValue();编辑:查看更新的代码,我认为这就是问题所在:
String s = n.getNodeValue();
如果您查看文档,您将看到getNodeValue()
被定义为返回元素的null
,因此出现了问题。我的示例代码使用getTextContent()
,效果很好
看起来这只是将推迟在内存中对象的扩展,直到需要它们 您是否尝试过对返回的文档调用方法,而不仅仅是查看调试器?我怀疑所有操作都按预期进行。如果没有,请发布一个简短但完整的程序,显示其行为不正常。(请注意,在您给出的示例中,您甚至没有显示如何设置
builder
,也没有使用factory
)
编辑:您给出的代码对我很有用。下面是一个快速而肮脏但重要的完整程序(用于将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;
}
}
文件的内容是什么,变量xml是什么?你能像Jon Skeet在回答中说的那样向我们展示你导入的完整代码吗?刚刚编辑了我的消息,谢谢你的帮助,伙计们,我真的不明白怎么了。如果xml来自文件,你是否尝试过使用解析方法从文件中读取它??xml I是的,我尝试调用getElementsByTagName()了方法,其中有一个我知道存在的标记元素。@user393381:不,请发布一个简短但完整的程序-我可以编译和运行的程序,这将显示问题。@user393381:我现在已经用我自己的简短但完整的程序更新了我的答案。你可能想试试……我刚刚发布了一个代码thqt对我不起作用。我仍然不理解nd.我会试试你的代码。@Jon Skeet:你说的一切都是对的。正如你所怀疑的,它已经正常工作了,我使用的是getNodeValue()而不是getTextContent()。文本内容就是我想要的,我正在试着找出两者之间的区别。