プル解析にあまり慣れていないので (私は通常 SAX 派です)、そのようなことについて最も信頼できる情報源ではないかもしれませんが、ここでは...
ほとんどの (すべてではないにしても) Java プル パーサーは、特定の CDATA ノードを使用して CDATA セクションを公開する必要があると思います (たとえば、関連するイベント タイプは ですXMLStreamConstants.CDATA
)。そのため、ドキュメントを解析し、その CDATA セクション (SOAP<return>
要素内) を取り出して、その内容を抽出する必要があります。
そのセクションのコンテンツは、関心のあるドキュメントであるため、抽出したばかりのコンテンツに対して新しいプルパースを実行する必要があります。
申し訳ありませんが、これ以上お手伝いすることはできません。うまくいけば、あなたのために詳細をもう少し肉付けできる誰かがそこにいるでしょう.
EDIT:コメントに応じて、次のように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
}
}
いくつかの重要な注意事項:
- 通常、コンテンツ ハンドラーとして別のクラスを使用します。1 つは「メイン」ドキュメント (SOAP 要素を含む) 用で、もう 1 つは「ターゲット」ドキュメント (CDATA セクション内) 用です。できるだけ短くするために、ここではそうしていません。
- XML の形式はわかりませんが、
InputStream
ここにあると想定しています。クラスは、読み取り元のファイル名を指定する、 、またはInputSource
を喜んで使用します。あなたに最も適したものを使用してください。InputStream
Reader
String
- CDATA コンテンツを処理できるようにするには、SAX2 リーダーを使用する必要があります。デフォルトの SAX リーダーは、SAX2 に準拠している場合と準拠していない場合があります。そのため、(たとえば) 特定の SAX2 パーサーのインスタンスを手動で作成する必要がある場合があります。その場合は、いくつかの SAX2 パーサーのリストをここで見つけることができます。
- おそらくこれを行うより効率的な方法もあります(
StringBuffer
/StringBuilder
はオプションかもしれません)。繰り返しますが、単純にするためにこのようにしています。
- 私は実際にこのコードをテストしていません。あなたのマイレージは異なる場合があります。
以前に SAX を使用したことがない場合は、おそらくSAX クイックスタート ガイドを実行する価値もあります。