不太熟悉拉解析(我通常是 SAX 人),我可能不是此类事情最权威的来源,但这里有......
我相信大多数(如果不是全部)Java 拉式解析器应该使用特定的 CDATA 节点公开 CDATA 部分(例如,我相信 StAX,相关的事件类型是XMLStreamConstants.CDATA
)。因此,您需要解析文档并提取该 CDATA 部分(在 SOAP<return>
元素内)并提取其内容。
该部分的内容是您感兴趣的文档,因此您希望反过来对刚刚提取的内容运行新的 pull-parse。
很抱歉,我无法提供更多帮助。希望会有其他人可以为您提供更多细节。
编辑:作为对评论的回应,您可以使用 SAX 实现这一点,如下所示(为简洁起见,省略了异常处理):
import org.xml.sax.ext.DefaultHandler2;
import org.xml.sax.helpers.XMLReaderFactory;
import org.xml.sax.XMLReader;
class MyParsingApp extends DefaultHandler2 // see note 1
{
private boolean inCdata, parsingSubDocument;
private String subDocument;
public static void main (String args[])
{
InputStream stream = ... // see note 2
XMLReader reader = XMLReaderFactory.createXMLReader(); // see note 3
reader.setContentHandler (new MyParsingApp ( ));
reader.parse (new InputSource(stream));
parsingSubDocument = true;
reader.parse (new InputSource(new StringReader(subDocument)));
...
}
public MyParsingApp ( )
{
inCdata = parsingSubDocument = false;
subDocument = "";
}
@Override
public void startCDATA() throws SAXException
{
inCdata = true;
}
@Override
public void endCDATA() throws SAXException
{
inCdata = false;
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException
{
if (inCdata)
subDocument += new String(ch, start, length); // see note 4
}
}
一些重要的注意事项:
- 通常您会使用一个单独的类作为您的内容处理程序,可能一个用于“主”文档(包括 SOAP 元素),一个用于您的“目标”文档(在 CDATA 部分中)。我在这里没有这样做只是为了让它尽可能短。
- 我不确定你的 XML 是什么格式,但我假设它在
InputStream
这里。该类InputSource
将愉快地使用 a InputStream
、 aReader
或 aString
指定要读取的文件名。使用最适合你的东西。
- 您需要使用 SAX2 阅读器才能处理 CDATA 内容。您的默认 SAX 阅读器可能与 SAX2 兼容,也可能不兼容。因此,您可能需要(例如)手动创建特定 SAX2 解析器的实例。如果是这种情况,您可以在此处找到一些 SAX2 解析器的列表。
- 也可能有更有效的方法来做到这一点(
StringBuffer
/StringBuilder
可能是选项)。同样,为了简单起见,我只是这样做。
- 我还没有实际测试过这段代码。你的旅费可能会改变。
如果您以前没有使用过 SAX,可能还值得阅读SAX 快速入门指南。