2

また質問です。今回は、サーバーから受信した XML メッセージを解析しています。賢いと思われる誰かが、HTML ページを XML メッセージに配置することにしました。この XML メッセージから HTML ページを文字列として抽出したいので、問題に直面しています。

わかりました、これは私が解析している XML メッセージです:

<AmigoRequest> <From></From> <To></To> <MessageType>showMessage</MessageType> <Param0>general message</Param0> <Param1><html><head>test</head><body>Testhtml</body></html></Param1> </AmigoRequest>

Param1 で HTML ページが指定されていることがわかります。次の方法でメッセージを抽出しようとしました。

public String getParam1(ドキュメント d) {
        if (d.getDocumentElement().getTagName().equals("AmigoRequest")) {
            NodeList の結果 = d.getElementsByTagName("Param1");
            // Messagetype は、読み取っているメッセージによって異なります。           
            if (results.getLength() > 0 && 結果 != null) {                
                結果を返す.item(0).getFirstChild().getNodeValue();
            }
        }
        戻る "";
    }

ここで、d は文書形式の XML メッセージです。getNodeValue() が null を返すため、常に null 値が返されます。results.item(0).getFirstChild().hasChildNodes() を試すと、メッセージにタグがあることがわかるため、true が返されます。

<html><head>test</head><body>Testhtml</body></html>文字列内の Param0 からHTML メッセージを抽出するにはどうすればよいですか?

私は Android SDK 1.5 (ほぼ Java) と DOM パーサーを使用しています。

お時間をいただき、ご返信いただきありがとうございます。

アンテック

4

5 に答える 5

1

多くのことをチェックし、何千回も頭を悩ませた後、APIレベルを8に変更する必要があるという簡単な変更を思いつきました

于 2011-01-31T11:18:30.210 に答える
1

次のように、param1 の内容を取得できます。

public String getParam1(Document d) {
        if (d.getDocumentElement().getTagName().equals("AmigoRequest")) {
            NodeList results = d.getElementsByTagName("Param1");
            // Messagetype depends on what message we are reading.           
            if (results.getLength() > 0 && results != null) {                

                // String extractHTMLTags(String s) is a function that you have 
                // to implement in a way that will extract all the HTML tags inside a string.
                return extractHTMLTags(results.item(0).getTextContent());
            }
        }
        return "";
    }

関数を実装するだけです。

String extractHTMLTags(String s)

文字列からすべての HTML タグの出現を削除します。そのためには、この投稿を見ることができます:文字列から HTML タグを削除する

于 2010-01-12T17:19:40.447 に答える
0

あなたには利用できないのでgetTextContent()、別のオプションはそれを書くことです - それは難しいことではありません。実際、これを自分の使用のためだけに書いている場合、または雇用主がオープンソースに関して過度に厳格な規則を持っていない場合は、Apache の実装を出発点として見ることができます。行 610-646 には、必要なもののほとんどが含まれているようです。(Apache の著作権とライセンスを尊重してください。)

それ以外の場合、メソッドの大まかな擬似コードは次のようになります。

String getTextContent(Node node) {
    if (node has no children) 
        return "";

    if (node has 1 child)
        return getTextContent(node.getFirstChild());

    return getTextContent(new StringBuffer()).toString();
}

StringBuffer getTextContent(Node node, StringBuffer sb) {
    for each child of node {
        if (child is a text node) sb.append(child's text)
        else getTextContent(child, sb);
    }
    return sb;
}
于 2010-01-12T18:24:46.820 に答える
0

編集getTextContent(): Androidでサポートされていないという上記のコメントを見ました。別のプラットフォームを使用している人に役立つ場合に備えて、この回答はそのままにしておきます。

DOM API がサポートしている場合はgetTextContent()、次のようにを呼び出すことができます。

public String getParam1(Document d) {
        if (d.getDocumentElement().getTagName().equals("AmigoRequest")) {
            NodeList results = d.getElementsByTagName("Param1");
            // Messagetype depends on what message we are reading.           
            if (results != null) {                
                return results.getTextContent();
            }
        }
        return "";
    }

ただし、getTextContent()DOM レベル 3 API 呼び出しです。すべてのパーサーがそれをサポートすることが保証されているわけではありません。Xerces-J します。

ところで、元の例では、小切手nullが間違った場所にあります。そのはず:

        if (results != null && results.getLength() > 0) {                

そうしないと、results本当にnull.

于 2010-01-12T17:38:42.857 に答える
0

さて、私はコードでほとんどそこにいました...

public String getParam1(Document d) {
    if (d.getDocumentElement().getTagName().equals("AmigoRequest")) {
        NodeList results = d.getElementsByTagName("Param1");
        // Messagetype depends on what message we are reading.           
        if (results.getLength() > 0 && results != null) {                
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db;
            Element node = (Element) results.item(0); // get the value of Param1
            Document doc2 = null;
            try {

                db = dbf.newDocumentBuilder();
                doc2 = db.newDocument(); //create new document
                doc2.appendChild(doc2.importNode(node, true)); //import the <html>...</html> result in doc2

            } catch (ParserConfigurationException e) {
                // TODO Auto-generated catch block
                Log.d(TAG, " Exception ", e);
            } catch (DOMException e) {
                // TODO: handle exception
                Log.d(TAG, " Exception ", e);
            } catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();               }              


            return doc2. .....// All I'm missing is something to convert a Document to a string.
        }
    }
    return "";

}

私のコードのコメントで説明したように。私が見逃しているのは、ドキュメントから文字列を作成することだけです。Android で Transform クラスを使用することはできません... doc2.toString() は、オブジェクトのシリアル化を提供します..

しかし、私の次のステップは、これがうまくいかない場合に独自のパーサーを作成することです;)

最高のコードではなく、一時的な解決策です。

public String getParam1(String b) {
        return b
                .substring(b.indexOf("<Param1>") + "<Param1>".length(), b.indexOf("</Param1>"));
    }

String b は XML ドキュメント文字列です。

于 2010-01-13T13:29:07.443 に答える