2011-01-05 4 views
2

j'ai un fichier XML à analyser, qui, comme indiqué ci-dessousSAX: Récupération des balises HTML de XML

<feed> 
    <feed_id>12941450184d2315fa63d6358242</feed_id> 
    <content> <fieldset><table cellpadding='0' border='0' cellspacing='0' style="clear :both"><tr valign='top' ><td width='35' ><a href='http://mypage.rediff.com/android/32868898' class='space' onmousedown="return enc(this,'http://track.rediff.com/click?url=___http%3A%2F%2Fmypage.rediff.com%2Fandroid%2F32868898___&service=mypage_feeds&clientip=202.137.232.113&pos=0&feed_id=12941450184d2315fa63d6358242&prc_id=32868898&rowid=674061088')" ><div style='width:25px;height:25px;overflow:hidden;'><img src='http://socialimg04.rediff.com/image.php?uid=32868898&type=thumb' width='25' vspace='0' /></div></a></td> <td><span><a href='http://mypage.rediff.com/android/32868898' class="space" onmousedown="return enc(this,'http://track.rediff.com/click?url=___http%3A%2F%2Fmypage.rediff.com%2Fandroid%2F32868898___&service=mypage_feeds&clientip=202.137.232.113&pos=0&feed_id=12941450184d2315fa63d6358242&prc_id=32868898&rowid=674061088')" >Android </a> </span><span style='color:#000000 !important;'>testing</span><div class='divtext'></div></td></tr><tr><td height='5' ></td></tr></table></fieldset><br/></content> 
    <action>status updated</action> 
</feed> 

Tag contient le contenu HTML, qui contient les données dont j'ai besoin. J'utilise un analyseur SAX. Voici ce que je fais

private Timeline timeLine; //Object 
private String tempStr; 

public void characters(char[] ch, int start, int length) 
     throws SAXException { 
    tempStr = new String(ch, start, length); 
} 

public void endElement(String uri, String localName, String qName) 
     throws SAXException { 
    if (localName.equalsIgnoreCase("content")) { 
     if (timeLine != null) { 
      timeLine.setContent(tempStr); 
     } 
} 

Cette logique fonctionne-t-elle? Si non, comment puis-je extraire des données HTML incorporées à partir de XML en utilisant SAX Parser?

+0

D'où proviennent 'timeLine' et' tempStr'? –

+0

@ L'Elite Gentleman édité pour prendre en charge les variables req. –

Répondre

1

Vous pouvez analyser html après tout html est également xml.There est un lien similaire à celui de stackoverflow.You pouvez essayer cette How to parse the html content in android using SAX PARSER

+0

(Ce n'est pas vrai dans le cas général que "html est aussi xml", même si c'est dans ce contexte.) –

+0

+1: La réponse acceptée pour cette question est la façon la plus simple de gérer cela. –

+0

HTML est * donc * totalement pas XML. L'analyseur SAX meurt si vous lui donnez des balises img ou p sans fermer ... ce qui est un code HTML valide, sinon XHTML valide. – mjfgates

0

Si le html est en fait xhtml, vous pouvez l'analyser en utilisant SAX et extraire les contenu xhtml de l'étiquette <content>, mais pas presque aussi facilement.

Vous devrez faire en sorte que votre gestionnaire réponde réellement aux événements qui seront déclenchés par toutes les balises xhtml dans la balise <content>, et soit construire quelque chose ressemblant à une structure DOM, que vous pourriez ensuite sérialiser en format xml, ou à la volée écrire directement dans un tampon de chaîne XML en répliquant le contenu. Si vous modifiez votre fichier XML afin que le code HTML contenu dans la balise de contenu soit enveloppé dans un élément CDATA comme suggéré dans How to parse the html content in android using SAX PARSER, quelque chose d'assez proche de votre code devrait fonctionner. Mais vous ne pouvez pas simplement mettre le contenu dans votre variable String tempStr dans la méthode characters comme vous le faites. Vous devez disposer d'une méthode startElement qui initialise un tampon pour la chaîne en voyant la balise <content>, collecter dans ce tampon dans la méthode characters et placer le résultat quelque part dans le endElement pour le tag <content>.

1

Sur l'élément de démarrage, si l'élément est content, votre tampon Str Str doit être initialisé. si le contenu a déjà été démarré, capture l'élément de démarrage actuel et ses attributs et le met à jour dans le tampon Str temp.

Sur les caractères, si le contenu est démarré, ajoutez les filtres au tampon de chaîne en cours.

Sur l'élément final si le contenu est démarré, capturez le noeud final et ajoutez-le au tampon de chaîne.

Mon Assomption:

Le xml aura une seule balise de contenu.

+0

+ !: Réécriture complète de ce commentaire lors de la relecture. Oui, je pense que cela fonctionnera comme la manipulation de chaîne xml à la volée que j'ai référencée dans ma réponse. Et c'est une belle description concise. –

0

je trouve la solution de cette manière:

Note: Dans cette solution, je veux obtenir le contenu html entre <chapter> balises (<chapter> ... html content ... </chapter>)

DefaultHandler handler = new DefaultHandler() { 

    boolean chap = false; 

    public char[] temp; 
    int chapterStart; 
    int chapterEnd; 

    public void startElement(String uri, String localName, 
      String qName, Attributes attributes) 
      throws SAXException { 

      System.out.println("Start Element :" + qName); 

      if (qName.equalsIgnoreCase("chapter")) { 
       chap = true; 
      } 

     } 

     public void endElement(String uri, String localName, 
      String qName) throws SAXException { 

      if (qName.equalsIgnoreCase("chapter")) { 
       System.out.println(new String(temp, chapterStart, chapterEnd-chapterStart)); 

      } 
      System.out.println("End Element :" + qName); 

     } 

     public void characters(char ch[], int start, int length) 
       throws SAXException { 

      if (chap) { 
       temp = ch; 
       chapterStart = start; 
       chap = false; 
      } 
      chapterEnd = start + length; 

     } 

    }; 

Mise à jour:

Mon code ont un bug.parce que la longueur de ch [] dans DocumentHandler varie dans une situation différente!

Questions connexes