En Java, comment analyser XML en tant que chaîne au lieu d'un fichier?


249

J'ai le code suivant:

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

Comment puis-je obtenir pour analyser XML contenu dans une chaîne au lieu d'un fichier?


7
A noter également que l'on javax.xml.parsers.DocumentBuilder.parse(string)suppose que la chaîne est un uri (terrible ...)
Christophe Roussy

Réponses:


479

J'ai cette fonction dans ma base de code, cela 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
@shsteimer Je passe en chaîne xml et il retourne null. Il ne lève aucune exception. Qu'est-ce qui ne va pas?
sattu

@sattu: Vous devez le poster en tant que nouvelle question. C'est vraiment difficile à dire sans voir votre code.
Alexander Malakhov

merci beaucoup, m'a sauvé des tas de lignes de code, je le reconvertis en texte mais je savais qu'il y avait une meilleure façon!
nkuebelbeck

3
si j'ai <? XML> il retourne un nœud vide que puis-je faire?
Dejell

1
Vérifiez que vous utilisez la bonne déclaration d'importation:import org.xml.sax.InputSource;
Daniel Eisenreich

18

Une façon consiste à utiliser la version d'analyse qui prend une InputSource plutôt qu'un fichier

Un InputSource SAX peut être construit à partir d'un objet Reader. Un objet Reader est le StringReader

Donc quelque chose comme

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

5

les javadocs montrent que la méthode d'analyse est surchargée.

Créez un StringStream ou InputSource en utilisant votre chaîne XML et vous devez être défini.


4

Convertissez la chaîne en InputStream et passez-la à DocumentBuilder

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

EDIT
En réponse au commentaire de bendin concernant l'encodage, voir la réponse de shsteimer à cette question.


1
Je préfère le StringReader car il évite String.getBytes (), mais cela devrait généralement fonctionner également.
Michael Myers

3
Lorsque vous appelez getBytes (), quel encodage attendez-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?
bendin

2

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;
}

0

Vous pouvez utiliser le package Scilca XML Progession disponible sur GitHub.

XMLIterator xi = new VirtualXML.XMLIterator("<xml />");
XMLReader xr = new XMLReader(xi);
Document d = xr.parseDocument();

0

juste entrer

this.file = File("your xml file path")
this.document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(file)
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.