Java parse((新的StringReader(xml))返回DeferredDocumentImpl

Java parse((新的StringReader(xml))返回DeferredDocumentImpl,java,Java,我试图理解我可能犯了什么错误,但却找不到解决办法 public static Document getXMLFromString(String xml) { org.w3c.dom.Document doc = null; try { DocumentBuilderFactory factory = DocumentBuilderFactory .newInstance();

我试图理解我可能犯了什么错误,但却找不到解决办法

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是一个包含

<?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()。文本内容就是我想要的,我正在试着找出两者之间的区别。