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?

Dewayne
la source
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

shsteimer
la source
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. 
Uri
la source
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.

duffymo
la source
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.

Akbar ibrahim
la source
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;
}
Yasir Shabbir Choudhary
la source
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();
Shukant Pal
la source
0

juste entrer

this.file = File("your xml file path")
this.document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(file)
lgb
la source