2010-01-02 9 views
0

Je dois analyser le contenu obtenu sur le Web et contenir des caractères spéciaux. Dans ce cas, la chaîne de contenu apparaît comme ce qui suit:Problème de codage

<?xml version="1.0" encoding="UTF-8"?> 
<products> 
    <product> 
    <id>1</id> 
    <price>2.14</price> 
    <title>test &#382; test</title> 

Lorsque le Contet ci-dessus est transmis aux caractères de la méthode(), dans la classe qui est prolongée de org.xml.sax.helpers.DefaultHandler:

public class ProductsXMLHandler extends DefaultHandler { 
... 

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

Je remarqué le tableau test &#382; test est divisé en trois tableaux: « test », « &#382; » et « test » de sorte que le valeurElément ne correspond pas test &#382; test qui devrait être le résultat. Est-ce que quelqu'un sait comment résoudre le problème?

Est-il nécessaire de recoder la chaîne source:

<?xml version="1.0" encoding="UTF-8"?> 
<products> 
    <product> 
    <id>1</id> 
    <price>2.14</price> 
    <title>test &#382; test</title> 

avant qu'il ne soit transmis à la classe de gestionnaire XML?

Merci!

Répondre

3

Lorsque J on Skeet said in in answer, characters est appelé plusieurs fois. Ce que vous devez faire est la suivante:

  • dans startTag, créez un StringBuffer, et la note (une valeur booléenne par exemple) si vous êtes dans le bon tag que vous recherchez.
  • à characters, si vous êtes dans la balise droite (si le booléen défini précédemment est vrai), mettre les personnages dans le StringBuffer
  • dans endTag, si vous obtenez de l'étiquette droite (voir booléen, même chose comme précédemment), prenez le contenu du StringBuffer et voilà! Voici votre chaîne complète. N'oubliez pas de vider le StringBuffer après cela.
2

Voulez-vous dire que characters est appelé trois fois? Si c'est le cas, vous avez juste besoin de faire en sorte que votre code gère cela - l'analyseur est parfaitement libre de le faire. Vous ne devez pas supposer que vous obtiendrez toutes les données de personnage en un seul appel.

De la documentation DocumentHandler.characters():

parseurs SAX peuvent retourner toutes les données de caractères contigus en un seul morceau, ou ils peuvent le diviser en plusieurs morceaux; Toutefois, tous les caractères d'un événement doivent provenir de la même entité externe , de sorte que le localisateur fournit des informations utiles.

2

Je ne pense pas que vous pouvez faire quelque chose à ce sujet, c'est par l'API SAX. Plus précisément, de http://java.sun.com/javase/6/docs/api/org/xml/sax/ContentHandler.html#characters(char[],%20int,%20int)

Le Parser appellera cette méthode pour rapport chaque bloc de données de caractère. Les analyseurs syntaxiques SAX peuvent renvoyer toutes les données de caractères contiguës en un seul morceau, ou ils peuvent le diviser en plusieurs blocs ; cependant, tous les caractères dans un événement unique doivent provenir de la même entité externe, donc que le localisateur fournit des informations utiles .

(Je souligne)