2011-01-04 4 views
0

Par exemple, je veux générer le fichier XML suivant en utilisant java avec DOMGénérer un fichier XML à partir du code java

<catalogue> 
    <books> 
     <book id="1"> 
      <name>Gone with the wind</name> 
      <quantity>2</quantity> 
     </book> 
     <book id="2"> 
      <name>Call of the wind</name> 
      <quantity>3</quantity> 
     </book> 
     <book id="3"> 
      <quality>Good</quality> 
      </book> 
    </books> 
    </catalogue> 

Ce n'est pas très difficile de produire un fichier xml avec seulement 1 nœud de livre nommé, mais avec plus que 1 avec le même nom, je ne sais pas comment le faire? Je suis l'erreur:

double variable de

locale Ceci est une partie de mon code java: J'ai essayé de créer le premier livre élément avec le code:

Element book = doc.createElement("book"); 
    rootElement.appendChild(book); 

    Element name = doc.createElement("name"); 
    name.appendChild(doc.createTextNode("Gone with the wind")); 
    book.appendChild(name); 

Et puis j'ai utilisé le même code pour créer le deuxième et le troisième livre élément, et j'ai trouvé l'erreur. Existe-t-il un autre moyen de le faire? Quelqu'un peut-il me donner une suggestion s'il vous plaît? Merci beaucoup pour votre temps

+4

Pouvez-vous nous montrer le code où vous obtenez cette erreur? En ce qui concerne XML valide, cela semble correct, donc je ne sais pas pourquoi vous obtiendriez cette erreur sans voir le code Java. – JasCav

+0

En fait, je n'ai pas beaucoup d'expérience en Java. J'ai utilisé: Element book = doc.createElement ("book") pour créer le premier élément du livre et quand j'ai utilisé le même code pour générer un autre nœud de livre, il a fait l'erreur. J'ai pensé à la boucle mais je ne sais pas comment faire face à un nœud enfant.Merci pour la réponse rapide – davidBecks

+0

Avez-vous regardé lire le XML pour voir quel DOM est produit? Vous devriez être capable de regarder le DOM dans le débogueur. –

Répondre

2

Je suppose que vous ajoutez le même objet deux fois. Vous devez appeler createElement à chaque fois.

Cela ne fonctionnera pas

Element name = doc.createElement("name"); 
    name.appendChild(doc.createTextNode("Gone with the wind")); 
    book.appendChild(name); 

    name.appendChild(doc.createTextNode("Call of the wind")); 
    book.appendChild(name); 

Vous devez faire

Element name = doc.createElement("name"); 
    name.appendChild(doc.createTextNode("Gone with the wind")); 
    book.appendChild(name); 

    name = doc.createElement("name"); 
    name.appendChild(doc.createTextNode("Call of the wind")); 
    book.appendChild(name); 

Exemple complet

 Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument(); 

    Element root = doc.createElement("catalogue"); 
    doc.appendChild(root); 

    Element books = doc.createElement("books"); 
    root.appendChild(books); 

    Element book1 = doc.createElement("book"); 
    book1.setAttribute("id", "1"); 
    books.appendChild(book1); 

    Element book1_name = doc.createElement("name"); 
    book1_name.setTextContent("Gone with the wind"); 
    book1.appendChild(book1_name); 

    Element book1_quantity = doc.createElement("quantity"); 
    book1_quantity.setTextContent("2"); 
    book1.appendChild(book1_quantity); 

    Element book2 = doc.createElement("book"); 
    book2.setAttribute("id", "2"); 
    books.appendChild(book2); 

    Element book2_name = doc.createElement("name"); 
    book2_name.setTextContent("Call of the wind"); 
    book2.appendChild(book2_name); 

    Element book2_quantity = doc.createElement("quantity"); 
    book2_quantity.setTextContent("3"); 
    book2.appendChild(book2_quantity); 

    Element book3 = doc.createElement("book"); 
    book3.setAttribute("id", "3"); 
    books.appendChild(book3); 

    Element book3_quality = doc.createElement("quality"); 
    book3_quality.setTextContent("Good"); 
    book3.appendChild(book3_quality); 
+0

Merci Andrew, en regardant votre code je me trouve vraiment stupide. Merci encore beaucoup – davidBecks

0

Si le problème est présent, alors vous avez déclaré plusieurs variables locales avec le même nom. Dans tous les langages de programmation, vous ne pouvez avoir qu'une seule variable avec le même nom déclaré dans le même champ . Une portée est généralement entourée d'accolades. Vous pouvez utiliser le même nom de variable dans la même méthode si vous les indentez avec des étendues supplémentaires, par ex. comme l'exemple ci-dessous. Cependant, vous devriez penser à la dénomination de vos variables, ou si vous devriez plutôt utiliser des instructions de boucle. Vous pouvez également numéroter vos variables, par ex. nom1, nom2, NAME3 etc.

alt text

Si vous voulez vraiment avoir plusieurs variables avec le même nom, vous pouvez les séparer par des blocs de code sans nom en utilisant simplement les accolades comme ceci:

Element book = doc.createElement("book"); 
rootElement.appendChild(book); 

{ 
    Element name = doc.createElement("name"); 
    name.appendChild(doc.createTextNode("Gone with the wind")); 
    book.appendChild(name); 
} 
{ 
    Element name = doc.createElement("name"); 
    name.appendChild(doc.createTextNode("Call of the wind")); 
    book.appendChild(name); 
} 
... 

Les deux name variables vie dans les étendues séparées, de sorte qu'ils ne interfèrent pas les uns avec les autres et ne conduira pas au message d'erreur du compilateur "Dupliquer le nom de la variable locale".

+0

Merci je pense qu'il doit être utile – davidBecks

Questions connexes