2009-11-12 5 views
2
<?xml version="1.0" ?> 
<input> 
    <sys> 
     <protocol>TL1</protocol> 
     <ipAddress>10.05.2.3</ipAddress> 
     <port>2001</port> 
     <prompt>agent</prompt>  
     <TL1Command> 
      <type>get</type> 
      <command_code>...........</command_code> 
      <staging_block>  
       <tid>...........</tid> 
       <aid>...........</aid> 
       <ctag>..........</ctag> 
       <gen_block>.....</gen_block> 
      </staging_block> 
      <payload_block> 
       <data_block>.......</data_block> 
      </payload_block> 
    </TL1Command> 
    </sys> 
    <sys> 
     <protocol>TL1</protocol> 
     <ipAddress>10.5.2.98</ipAddress> 
     <port>2001</port> 
     <prompt>agent</prompt>  
     <TL1Command> 
      <type>get</type> 
      <command_code>...........</command_code> 
      <staging_block>  
       <tid>...........</tid> 
       <aid>...........</aid> 
       <ctag>..........</ctag> 
       <gen_block>.....</gen_block> 
      </staging_block> 
      <payload_block> 
       <data_block>.......</data_block> 
       <data_block>.......</data_block> 
       <data_block>.......</data_block> 
      </payload_block> 
    </TL1Command> 
    </sys> 
</input> 

Je veux savoir comment analyser ce XML en utilisant Java. De telle sorte que je peux utiliser ces données telles qu'elles sont de la même manière pour mon programme. Je sais comment l'analyser mais le problème est que pour chaque commande il peut y avoir un nombre différent de blocs de données. Donc, après l'analyse, j'ai besoin d'utiliser des datablocks respectifs pour les commandes respectives. Je veux dire pour la première commande en retrivant je devrais obtenir seulement une valeur de bloc de données et pour la 2ème commande 3 blocs de données et ainsi de suite. S'il vous plaît laissez-moi savoir tout exemple de code pour résoudre ce problème.Comment puis-je analyser XML en utilisant Java?

+0

Qu'est-ce parseurs avez-vous essayé? et je ne comprends pas comment vous essayez d'utiliser les données – Mark

+0

J'aime vraiment JIBX (http://jibx.sourceforge.net/), grâce à stackoverflow.com :) – Trick

Répondre

11

Il existe deux approches de base pour analyser XML.

  1. Une approche basée sur un curseur (StAX) ou un événement (SAX). Beaucoup plus léger mais souvent plus verbeux. Ceci est particulièrement utile lorsque vous ne voulez que récupérer de petites pièces ou que le traitement est facile. et
  2. Approches basées sur l'arbre (DOM). En général, les analyseurs DOM sont construits sur les parseurs SAX/StAX. Ils nécessitent plus de traitement et exigent généralement que vous ayez un document entier en mémoire avant de pouvoir faire quoi que ce soit (alors que SAX/StAX peut être plus efficace et plus rapide à répondre). Mais ceci est utile pour l'accès "aléatoire" aux parties de document.

Choisissez celui qui vous convient le mieux.

+1

Un autre analyseur xml open source est vtd-xml, qui est considéré comme un peu plus avancé que DOM, SAX et Pull –

0

Comme décrit par Cletus, vous devez choisir entre l'approche basée sur l'événement ou la Arbre DOM que vous devrez traverser. Considérez le scénario basé sur les événements comme une sorte de machine à états où vous, en entrant l'élément "payload_block", vous définissez une propriété correspondante et tant que les événements de "data_block" sont entrés, vous les lisez aussi longtemps comme l'événement proche de playload_block vient. Lorsque vous parcourez l'arborescence, vous lisez les enfants de "payload_block" et attendez une liste que vous pouvez parcourir et recueillir vos données.

0

Difficile de dire le vrai problème. Par souci de simplicité, je construisais un arbre DOM et lisais les données de cette structure.

Une classe typique pour TL1Command pourrait alors ressembler à:

class TL1Command { 
    String type; 
    String commandLine; 
    StagingBlock stagingBlock; 
    List<DataBlock> dataBlocks; 
} 

Cette structure est suffisamment souple pour gérer un nombre différent de blocs de données dans chaque TL1Command. (Était que la question?)

2

manière la plus simple serait de charger le document comme un document DOM

obtenir ensuite ce que vous avez besoin en utilisant XPath

Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(inputStream); 

NodeList nodeList = XPathAPI.selectNodeList(document, "/sys"); 
for (int i = 0; i < nodeList.getLength(); i++) { 
    Node node = nodeList.item(i); 
    System.out.println(node.getTextContent()); 
} 

Découvrez un tutoriel XPath here.

0

Je aime vraiment (et son juste mon avis) l'approche SAX lorsque vous connaissez bien la structure de votre files.Here est un lien qui peut vous aider à SAX2 Tutorial

0

Si vous avez seulement besoin d'obtenir Des fragments XML dans/hors d'un graphe d'objet, alors vous pouvez considérer XStream qui est une simple bibliothèque de marshalling/unmarshalling légère.

0

Vous pouvez également savoir vtd-xml, une autre analyse XML open source/indexation lib ...

1

utilisation soit DOM (Document Object Model) analyseur ou SAX (Simple API pour XML) parser pour analyser votre document xml. Créez d'abord un document XML. (Fichier avec l'extension .xml) télécharger l'analyseur à partir du lien http://archive.apache.org/dist/xml/xerces-j/ et analyser votre document

0

J'ai écrit une API très simple précisément pour cette raison. Il utilise l'analyseur DOM ci-dessous, mais expose une API très simple et facile à utiliser qui vous permet d'accéder facilement aux données XML. C'est juste un fichier Java unique que vous pouvez utiliser comme bibliothèque dans votre code. J'espère que cela pourra aider.

http://argonrain.wordpress.com/2009/10/27/000/