2009-10-08 7 views
0

Il existe un comportement étrange dans l'analyse du fichier KML produit par Google Earth à l'aide d'un analyseur conforme, JAK. L'espace de noms attendu par l'analyseur n'est pas écrit comme correct par le système de production GE Kml et lors de la lecture de ce fichier KML dans une autre application Java, la validation échoue.Désinfection du flux KML pour modifier l'espace de noms xml

Nous analysons le flux en cours de lecture et remplaçons les occurrences de tout autre espace de nom avec l'espace de noms approprié. Cela doit seulement être fait une fois près du début du fichier. L'approche tentée consistait à analyser les premières lignes en une chaîne, à effectuer une recherche et un remplacement, à créer un train de chaînes et à concaténer le "reste" de FileInputStream en StringStream à l'aide d'un SequenceInputStream. Cela ne fonctionne cependant pas. Toutes les idées sont les bienvenues.

Voici ce que le fragment xmlns KML commence par:

<code> 
    <kml xmlns="http://earth.google.com/kml/2.2"> 
</code> 

et voici ce que nous voulons remplacer par:

<code> 
    <kml xmlns="http://www.opengis.net/kml/2.2"> 
</code> 

Le flux de séquence retourne une valeur disponible défectueuse (uniquement pour la 1er flux dans la séquence) provoquant l'échec de l'analyseur.

+0

Informations insuffisantes. Des exemples de ce que vous traitez et de ce que vous attendez seraient très utiles. Aussi une explication de "ne fonctionne pas" (exception, message d'erreur, sortie incorrecte, etc ...) –

Répondre

1

SequenceInputStream fonctionne de manière inhabituelle. Il joint les deux flux dans un flux virtuel. La méthode available() pour un SequenceInputStream renvoie la longueur pour le flux en cours, pas tous les flux combinés comme prévu. A la place d'un SequenceInputStream, vous devez utiliser un StringBuffer pour lire le fichier et apporter les modifications nécessaires à la lecture des données. StringBuffer améliore les performances de l'ajout d'objets chaîne. Parse la méthode StringBuffer.toString() à un StringStream si vous avez besoin d'une sortie de flux à la fin.

Questions connexes