1

無視したい SOAP タグを含む XML ファイルがあります。

XML ファイルを pull-parser で解析していましたが、SOAP タグが登場したため動作しなくなりました。

XML ファイルは次のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
  <ns1:getAllUsersListResponse xmlns:ns1="http://webservice.business.ese.wiccore.myent.com/">
  <return xsi:type="xs:string" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema"><![CDATA[<User>

タグ内には、<User>解析したいすべてのタグが含まれています(そして、プルパーサーで方法を知っています)。

</User>]]></return>
     <return xsi:type="xs:string" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema"><![CDATA[<User>

それまで

</User>]]></return>
  </ns1:getAllUsersListResponse>
</soap:Body> 
</soap:Envelope>

問題は、通常のタグを解析する方法は知っていますが、この Soap タグを解析したくないので、SOAP タグを無視したいということです! これを達成する方法を知っている人はいますか?

4

1 に答える 1

1

プル解析にあまり慣れていないので (私は通常 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. 通常、コンテンツ ハンドラーとして別のクラスを使用します。1 つは「メイン」ドキュメント (SOAP 要素を含む) 用で、もう 1 つは「ターゲット」ドキュメント (CDATA セクション内) 用です。できるだけ短くするために、ここではそうしていません。
  2. XML の形式はわかりませんが、InputStreamここにあると想定しています。クラスは、読み取り元のファイル名を指定する、 、またはInputSourceを喜んで使用します。あなたに最も適したものを使用してください。InputStreamReaderString
  3. CDATA コンテンツを処理できるようにするには、SAX2 リーダーを使用する必要があります。デフォルトの SAX リーダーは、SAX2 に準拠している場合と準拠していない場合があります。そのため、(たとえば) 特定の SAX2 パーサーのインスタンスを手動で作成する必要がある場合があります。その場合は、いくつかの SAX2 パーサーのリストをここで見つけることができます。
  4. おそらくこれを行うより効率的な方法もあります(StringBuffer/StringBuilderはオプションかもしれません)。繰り返しますが、単純にするためにこのようにしています。
  5. 私は実際にこのコードをテストしていません。あなたのマイレージは異なる場合があります。

以前に SAX を使用したことがない場合は、おそらくSAX クイックスタート ガイドを実行する価値もあります。

于 2011-05-14T00:28:33.757 に答える