268 votes

En Java, comment analyser XML comme une chaîne de caractères au lieu d'un fichier ?

J'ai le code suivant :

DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(xmlFile);

Comment puis-je faire en sorte qu'il analyse le XML contenu dans une chaîne de caractères plutôt que dans un fichier ?

7 votes

Il convient également de noter que javax.xml.parsers.DocumentBuilder.parse(string) suppose que la chaîne est un uri (terrible...)

508voto

shsteimer Points 8749

J'ai cette fonction dans ma base de code, elle devrait fonctionner pour vous.

public static Document loadXMLFromString(String xml) throws Exception
{
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = factory.newDocumentBuilder();
    InputSource is = new InputSource(new StringReader(xml));
    return builder.parse(is);
}

voir aussi cette question similaire

3 votes

@shsteimer Je passe une chaîne xml et elle renvoie null. Il n'y a pas d'exception. Qu'est-ce qui ne va pas ?

0 votes

@sattu : Vous devriez poser une nouvelle question. C'est vraiment difficile à dire sans voir votre code.

0 votes

Merci beaucoup, cela m'a permis d'économiser plusieurs lignes de code, j'étais en train de le reconvertir en texte mais je savais qu'il y avait une meilleure façon de faire !

20voto

Uri Points 50687

Une solution consiste à utiliser la version de parse qui prend une source d'entrée (InputSource) plutôt qu'un fichier

Une source d'entrée SAX peut être construite à partir d'un objet Reader. Un objet lecteur est le StringReader

Ainsi, quelque chose comme

parse(new InputSource(new StringReader(myString))) may work.

8voto

Akbar ibrahim Points 1993

Convertir la chaîne en un InputStream et la passer au DocumentBuilder

final InputStream stream = new ByteArrayInputStream(string.getBytes(StandardCharsets.UTF_8));
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
builder.parse(stream);

EDITAR
En réponse à bendin Voir le commentaire de M. B. concernant l'encodage. shsteimer La réponse de la Commission européenne à cette question.

1 votes

Je préférerais le StringReader parce qu'il évite String.getBytes(), mais cela devrait généralement travailler aussi.

3 votes

Lorsque vous appelez getBytes(), quel encodage voulez-vous qu'il utilise ? Comment dites-vous à l'analyseur XML quel encodage il obtient ? Vous attendez-vous à ce qu'il devine ? Que se passe-t-il lorsque vous êtes sur une plateforme où l'encodage par défaut n'est pas UTF-8 ?

6voto

J'utilise cette méthode

public Document parseXmlFromString(String xmlString){
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = factory.newDocumentBuilder();
    InputStream inputStream = new    ByteArrayInputStream(xmlString.getBytes());
    org.w3c.dom.Document document = builder.parse(inputStream);
    return document;
}

5voto

duffymo Points 188155

javadocs montrent que la méthode parse est surchargée.

Créez un StringStream ou un InputSource en utilisant votre chaîne XML et vous devriez être prêt.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X