Не слишком хорошо разбираясь в парсинге (я, как правило, парень SAX), я, вероятно, не самый авторитетный источник в таких вещах, но здесь ...
Я полагаю, что большинство (если не все) парсеры Java Pull должны предоставлять разделы CDATA, используя определенный узел CDATA (я считаю, что в StAX, например, соответствующий тип события XMLStreamConstants.CDATA
). Таким образом, вы захотите проанализировать ваш документ и извлечь этот раздел CDATA (внутри элемента SOAP <return>
) и извлечь его содержимое.
Содержимое этого раздела - это документ, который вас интересует, так что вы, в свою очередь, захотите выполнить новый разбор содержимого, которое вы только что извлекли.
Извините, я не могу помочь. Надеюсь, что найдется кто-то еще, кто сможет рассказать вам подробности подробнее.
РЕДАКТИРОВАТЬ: в ответ на комментарии, вы можете достичь этого, используя 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
с радостью будет использовать InputStream
, Reader
или String
, указывающие имя файла для чтения. Используйте то, что вам больше подходит.
- Вам понадобится ридер SAX2, чтобы иметь возможность обрабатывать содержимое CDATA. Ваш читатель SAX по умолчанию может или не может быть SAX2-совместимым. Таким образом, вам может понадобиться (например) вручную создать экземпляр определенного синтаксического анализатора SAX2. Вы можете найти список некоторых парсеров SAX2 здесь , если это так.
- Возможно, есть и более эффективные способы сделать это (
StringBuffer
/ StringBuilder
могут быть вариантами). Опять же, я просто делаю это так для простоты.
- Я на самом деле не проверял этот код. Ваш пробег может отличаться.
Если вы ранее не использовали SAX, возможно, стоит также ознакомиться с Краткое руководство по SAX .