2

XMLエンベロープで囲まれたHTMLを返すWebサービスを呼び出します...次のようなもの:

<xml version="1.0" cache="false">
    <text color="white">
        <p> Some text <br /> <p>
    </text>
</xml>

XmlPullParser を使用して、この XML/HTML を解析します。テキストを取得するには要素、私は次のことを行います:

case XmlPullParser.START_TAG:

    xmlNodeName = parser.getName();

    if (xmlNodeName.equalsIgnoreCase("text")) {
        String color = parser.getAttributeValue(null, "color");
        String text = parser.nextText();

        if (color.equalsIgnoreCase("white")) {

            detail.setDetail(Html.fromHtml(text).toString());

        }
    }
break;

これはうまく機能し、テキストまたはhtmlを取得しますいくつかの html タグが含まれている場合でも要素。

問題が発生するのは、要素のデータは、上記の例のように<p>タグで始まります。この場合、データは失われ、テキストは空になります。

どうすればこれを解決できますか?

編集

私のサービスの応答が実際には有効な XML ではなく、要素が適切に閉じられていないことを指摘してくれたNikrajeshに感謝します。しかし、私はサービスを制御できないため、返されたものを編集できません。あらゆるタイプの不正な HTML を解析できる、または少なくとも html タグの内容を取得できるHTML Agilityのようなものがあるのだろうか..私の場合は<text> ... </text>内のように?? それもいいでしょう。

または、サービスから取得したものを解析するために使用できる他のものは、適切に実装できる限り有効です。

下手な英語ですみません

4

3 に答える 3

3

<text>...</text>タグ内にあるのはテキスト要素ではなく、XML Node 要素であるため、このような動作が見られます。コンテンツは CDATA セクションで囲む必要があります。

編集:コメントで私の提案のコード セグメントを提供します。あなたが提供したサンプルXMLで実際に動作します。

         StringBuffer html = new StringBuffer();
         int eventType = parser.getEventType();
         while (eventType != XmlPullParser.END_DOCUMENT) {
          if(eventType == XmlPullParser.START_TAG) {
              String name = parser.getName();
              if(name.equalsIgnoreCase("text")){
                  isText = true;
              }else if(isText){
                  html.append("<");
                  html.append(name);
                  html.append(">");
              }
          } else if(eventType == XmlPullParser.END_TAG) {
              String name = parser.getName();
              if(name.equalsIgnoreCase("text")){
                  isText = false;
              }else if(isText){
                  html.append("</");
                  html.append(name);
                  html.append(">");                   
              }
          } else if(eventType == XmlPullParser.TEXT) {
              if(isText){
                  html.append(parser.getText());
              }
          }
          eventType = parser.next();
         }
于 2012-04-19T10:54:11.487 に答える
2

上記のコードでは"</p>"TAG を閉じていないためです。

<p> Some text <br /> </p>

この行を使用しました。

于 2012-04-19T10:52:20.613 に答える
1

解決

受信したデータを最初に文字列に変換するというMartin のアプローチに触発されて、私は一種の混合アプローチで問題を管理しました。

受信した InputStream の値を文字列に変換し、誤ったタグを "" (または任意のもの) に置き換えます: 次のように

InputStreamReader isr = new InputStreamReader(serviceReturnedStream);
BufferedReader br = new BufferedReader(isr);
StringBuilder xmlAsString = new StringBuilder(512);
String line;
try {
    while ((line = br.readLine()) != null) {
        xmlAsString.append(line.replace("<p>", "").replace("</p>", ""));
    }
} catch (IOException e) {
    e.printStackTrace();
}

これで、正しい XML データ (私の場合) を含む文字列ができたので、自分で手動で解析する代わりに、通常の XmlPullParser を使用して解析します。

XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
factory.setNamespaceAware(false);
XmlPullParser parser = factory.newPullParser();
parser.setInput(new StringReader(xmlAsString.toString()));

これが誰かを助けることを願っています!

于 2012-04-23T10:38:52.383 に答える