2010-09-22 7 views
0

Voici ma structure XMLAnalyse XML efficace en Java | Équivalent de C# XmlDocument en Java

<values> 
<inputs> 
<input>one</input> 
<input>two</input> 
</inputs> 
<inputs> 
<input>one</input> 
<input>three</input> 
</inputs> 
</values> 

BUT: Vous voulez mettre toutes les valeurs de nœud d'entrée dans une collection

Je peux écrire parser SAX/DOM, lecture basée sur la nom de noeud et placez chaque valeur dans la collection.

Est-ce le moyen le plus efficace?

Peut-on utiliser quelque chose de similaire à XmlDocument dans C#?

Merci :)

+0

Qu'est-ce que la taille du contenu XML? Pour les petits fichiers, utilisez DOM. Sinon SAX. – Jayan

+0

'XmlDocument' me semble massivement * inefficace *, c'est un modèle DOM. – skaffman

Répondre

0

Oui.

import org.w3c.dom.Document; 
import org.w3c.dom.Element; 
import org.w3c.dom.Node; 
import org.w3c.dom.NodeList; 

sont les classes dont vous avez besoin.

Voici un rapide tutorial.

Mais allons-y bien. Parser basé sur SAX est plus efficient :) XmlDocument analyse basée sur le type est plus .... convinient. :)

1

Essayez d'utiliser JAXB. Si vous voulez des choses vraiment évolutives, utilisez la fonctionnalité d'écoute de JAXB (avant/après unmarshall) et associez cela à un parseur SAX comme gestionnaire de contenu. Cela permettra à votre XML d'être aussi grand que vous voulez sans mâcher de la mémoire. Il coule juste à travers un flux.

Quelque chose comme ceci:

JAXBContext jc = ... 
Unmarshaller u = jc.createUnmarshaller(); 
u.setListener(new Unmarshaller.Listener() { 
    @Override 
    public void beforeUnmarshal(Object target, Object parent) { 
     if (target instanceof MyObj) { 
      ... 
     } 
    } 

    public void afterUnmarshal(Object target, Object parent) { 
     if (target instanceof MyObj) { 
      ... 
     } 
    } 
}; 
BufferedInputStream stream = new BufferedInputStream(inputStream); 

SAXParserFactory factory = SAXParserFactory.newInstance(); 
factory.setNamespaceAware(true); 
XMLReader reader = factory.newSAXParser().getXMLReader(); 
reader.setContentHandler(u.getUnmarshallerHandler()); 
reader.parse(new InputSource(stream)); 

//NOTE THIS CODE IS VERY ROUGH AND WONT COMPILE, BUT YOU SHOULD GET THE GIST 
+0

Je pense que stax serait tout aussi efficace mais plus confortable à utiliser – Yoni

2

Par défaut ces jours-ci. J'utilise Stax (Streaming API pour XML)

L'analyse Stax est agréable et efficace, mais ce n'est pas très agréable à utiliser.

itérer sur une structure XML, vous pouvez utiliser des techniques telles que le code ci-dessous ...

XMLEventReader reader = factory.createXMLEventReader(in); 

while(reader.hasNext()) { 
    XMLEvent e = reader.nextEvent(); 
    ... 
} 

mais la force réelle avec l'analyse syntaxique Stax vient quand vous pouvez être certain de ce que la structure XML est comme vous et n'a pas besoin de deviner quel sera le prochain événement (c'est-à-dire quand vous savez que le XML est conforme à un XSD).

+0

Je suppose que je devrais ajouter qu'une implémentation stax peut être trouvée dans le Java Web Services Development Pack JWSP. – Dunderklumpen

0

selon la taille du xml, vous pouvez aussi utiliser Castor
De XSD, vous pouvez générer des classes de cartographie et lorsque vous invoquez Unmarshal Castor
il va générer un objet complexe à base de ces classes remplies de contenu XML.