Announcement

Collapse
No announcement yet.

JDom mehrere gleichnamige Elemente hinzufügen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • JDom mehrere gleichnamige Elemente hinzufügen

    Hallo zusammen

    Ich verwende unter Netbeans JDom zum bearbeiten von XML Dokumenten, jeweils mit dem Saxparser.
    habe doch schon einiges geschafft, aber nun bin ich an einem Toten Punkt angelangt.
    docquest ist mein Hauptelement.

    Mein Problem ist nun folgendes: ich habe ein XML Document
    HTML Code:
    <?xml version="1.0" encoding="UTF-8"?>
    <offene>
     <questname>main</questname>
    </offene>

    und bei folgendem Code entsteht im JDom die org.jdom.IllegalAddException: The Content already has an existing parent "offene" Exeption

    wobei sie in folgendem Code entsteht:
    Code:
                List nachfolger = docquest.getRootElement().getChild("nachfolgequests").getChildren("quest");
                it=nachfolger.iterator();
                Element adele=new Element("questname");
                //hinzufügen der elemente aus Docquest zu (List) offenequests
                while(it.hasNext()){
                    adele.setText(((Element) it.next()).getText());
                    offenequests.add(0,adele);
                }
    Ich habe auch schon add(adele) und addall(nachfolger) ausprobiert, wobei letzteres mir nicht mal das gewünschte Resultat liefern könnte

    Der zu listende Teil aus Docquest ist folgender:
    HTML Code:
     <nachfolgequests>
      <quest>sauber32</quest>
      <quest>sauber</quest>
      <quest>dreiunddrei</quest>
     </nachfolgequests>

    Wenn die Das XML File nach der Exception Speichere sieht es wie folgt aus:
    HTML Code:
    <?xml version="1.0" encoding="UTF-8"?>
    <offene>
      <questname>sauber</questname>
    </offene>


    Im Internet und mit Google's Hilfe konnte ich nicht viel zu meinem Problem finden, wenn mir jemand einen Funktionierenden Weg erklären kann wäre ich dankbar

    gruss Multi

  • #2
    Ich kann die Struktur des XML nicht erkennen. Wo ist docquest? Warum soll das XML gespeichert werden, wenn es eine Exception gab? Was soll überhaupt passieren?

    Der Fehler besagt jedenfalls, dass du versuchst das Element "offene" als parent hinzuzufügen, obwohl dieses schon vorhanden ist
    Christian

    Comment


    • #3
      Originally posted by Christian Marquardt View Post
      Ich kann die Struktur des XML nicht erkennen. Wo ist docquest? Warum soll das XML gespeichert werden, wenn es eine Exception gab? Was soll überhaupt passieren?

      Der Fehler besagt jedenfalls, dass du versuchst das Element "offene" als parent hinzuzufügen, obwohl dieses schon vorhanden ist
      docquest ist mein hauptfile, der teil der ausgelesen wird habe ich gepostet, aber wenn es dir hilft:
      Spoiler:
      HTML Code:
      <?xml version="1.0" encoding="UTF-8"?>
      <quest>
       <vorbedingungen>
        <erledigt>nein</erledigt>
        <getan>main</getan>
       </vorbedingungen>
       <name>Die Stimme</name>
       <frage>Du wurdest ausgewaehlt die Welt zu retten, 
      jetzt bewege deinen Arsch von dieser Insel runter 
      und Rette sie</frage>
       <fragesound>einfuehrung.wav</fragesound>
       <antworten>
      <antwort>
        <text>gut</text>
        <gold>10</gold>
        <erfahrung>10</erfahrung>
        <gegenstand>Brot</gegenstand>
        <menge>1</menge>
        <antwort>Ein Mistvieh Weniger</antwort>
        <antwortsound>einviehwenige.wav</antwortsound>
       </antwort>
       <antwort>
        <text>naja</text>
        <gold>0</gold>
        <erfahrung>100</erfahrung>
        <gegenstand>Fleisch</gegenstand>
        <menge>1</menge>
        <antwort>Ein Mistvieh Weniger</antwort>
        <antwortsound>einviehwenige.wav</antwortsound>
       </antwort>
       <antwort>
        <text>schlecht</text>
        <gold>-10</gold>
        <erfahrung>1000</erfahrung>
        <gegenstand></gegenstand>
        <antwort>Ein Mistvieh Weniger</antwort>
        <antwortsound>einviehwenige.wav</antwortsound>
       </antwort>
      </antworten>
       <nachfolgequests>
        <quest>lecken32</quest>
        <quest>lecken</quest>
        <quest>dreiunddrei</quest>
       </nachfolgequests>
      </quest>


      mir ist schleierhaft WIE ich dem ganzen versuche ein neues Root element zu geben, code ist folgender wo der fehler afutritt:

      Code:
      List nachfolger = docquest.getRootElement().getChild("nachfolgequests").getChildren("quest");
                  it=nachfolger.iterator();
                  Element adele=new Element("questname");
                  //hinzufügen der elemente aus Docquest zu (List) offenequests
                  while(it.hasNext()){
                      adele.setText(((Element) it.next()).getText());
                      offenequests.add(0,adele);
                  }
      Gespeichert wird wenn ICH es sage, und es ist auc ne gute möglichkeit zu testen ob etwas geklappt hat wie man es gerne hätte

      Passieren: ich möchte 3 elemente mid dem Tag<questname></questname> mit verschiedenem inhalt in ein bereits Existierendes XML File einfügen, leider gibt es dabei exceptions, manchmal bockt auch der filter. welche möglichkeiten gibt es um das zu tun?

      Comment


      • #4
        Ich würde dir ja ein Demo schreiben, aber
        - ich sehe in deinem Ausgangs-XML kein <questname> dem man ausschneiden könnte und irgendwo einfügen könnte.

        - ein Hauptelement <docquest> sehe ich auch nicht

        und in welche Struktur das eingefügt werden soll, ergibt sich auch nicht

        Weiterhin ist es schlecht, dass der RootName -> quest später noch für untergeordnete Elemente genutzt wird



        Beginnen würde ich so, wenn man unterstellt, dass <questname> eigentlich <quest> ist:

        [highlight=java]

        Document hauptDoc=DocumentBuilderFactory.newInstance().newD ocumentBuilder().parse(new File("h:\\haupt.xml"));
        Document zielDoc=DocumentBuilderFactory.newInstance().newDo cumentBuilder().newDocument();
        Element root=zielDoc.createElement("root");
        zielDoc.appendChild(root);

        XPathExpression expr=XPathFactory.newInstance().newXPath().compile ("//quest/nachfolgequests/quest");
        Object result=expr.evaluate(hauptDoc,XPathConstants.NODES ET);
        NodeList nodes=(NodeList)result;
        for(int i=0;i<nodes.getLength();i++)
        {
        System.out.println(nodes.item(i).getTextContent()) ;
        Element child=zielDoc.createElement("questname");
        child.setTextContent(nodes.item(i).getTextContent( ));
        root.appendChild(child);
        }

        zielDoc.normalize();
        TransformerFactory tf=TransformerFactory.newInstance();
        Transformer transformer=tf.newTransformer();

        DOMSource source=new DOMSource(zielDoc);
        StreamResult r=new StreamResult(System.out);
        transformer.transform(source,r);
        [/highlight]

        Ergibt

        lecken32
        lecken
        dreiunddrei
        Code:
        <?xml version="1.0" encoding="UTF-8" standalone="no"?>
        <root>
            <questname>lecken32</questname>
            <questname>lecken</questname>
            <questname>dreiunddrei</questname>
        </root>
        Jetzt musst du das nur noch einfügen...
        Zuletzt editiert von Christian Marquardt; 24.07.2011, 18:46.
        Christian

        Comment


        • #5
          Das questname ist auch wirklich nicht so im Ausgangsdokument vorhanden, dort war es Quest(habs geändert, danke für den Hinweis, hab ich übersehen)

          mein Problem ist das hinzufügen des Elementes zum Gesamtdokument, wenn bereits eines mit gleichem Namen vorhanden ist.

          Dein Vorschlag sieht gut aus und scheint auch zu funktionieren, leider nicht bei mir, mit welchen Imports hast du es gemacht?

          und danke schon mal für deine Hilfe.

          gruss Multi

          EDIT: ich glaube ich habe meinen Fehler gefunden.

          EDIT2: ja, ich habe den SAX Parser verwendet, aber der kann anscheinend nur lesen und nicht schreiben, wie kann ich ein Document mit dem DOM Parser laden?
          Zuletzt editiert von Multithread; 24.07.2011, 22:27.

          Comment


          • #6
            DomOutputter und DOMBuilder

            Hallo Multi,
            habe es nicht getestet, aber so müsste es gehen:
            Code:
            final DOMOutputter domOutputter = new DOMOutputter() ;
            final org.w3c.dom.Document w3cDoc = domOutputter.output( <Dein_SAX-JDOM-Document>);
            final DOMBuilder domBuilder = new DOMBuilder() ;
            final jdomDomDocument = domBuilder.build(w3cDoc);
            Dem jdomDomDocument müsste man dann Daten hinzufügen können.
            http://www.winfonet.eu

            Comment


            • #7
              Dein Vorschlag sieht gut aus und scheint auch zu funktionieren, leider nicht bei mir, mit welchen Imports hast du es gemacht?
              Mit überhaupt keiner Fremdbibliothek -> Standardjava


              mein Problem ist das hinzufügen des Elementes zum Gesamtdokument, wenn bereits eines mit gleichem Namen vorhanden ist.
              Gemäß meinem Vorschlag brauchst du nur das zweite Document so zu laden wie das erste Document; mit XPATH den Knoten auszuwählen und die childs hinzufügen
              Zuletzt editiert von Christian Marquardt; 25.07.2011, 07:10.
              Christian

              Comment


              • #8
                Originally posted by ngomo View Post
                Hallo Multi,
                habe es nicht getestet, aber so müsste es gehen:
                Code:
                final DOMOutputter domOutputter = new DOMOutputter() ;
                final org.w3c.dom.Document w3cDoc = domOutputter.output( <Dein_SAX-JDOM-Document>);
                final DOMBuilder domBuilder = new DOMBuilder() ;
                final jdomDomDocument = domBuilder.build(w3cDoc);
                Dem jdomDomDocument müsste man dann Daten hinzufügen können.
                Danke vielmals, hat geklappt, Auf Anhieb, jetzt kann ich weitermachen



                Originally posted by Christian Marquardt View Post
                Mit überhaupt keiner Fremdbibliothek -> Standardjava


                Gemäß meinem Vorschlag brauchst du nur das zweite Document so zu laden wie das erste Document; mit XPATH den Knoten auszuwählen und die childs hinzufügen
                Ich kann noch kein Xpath ich hab vor 2 wochen frisch mit XML angefnagen, und JDOM erschien mir gut, hat sich ja auch bewahrheitet das es gut ist, praktisch keine Probleme gehabt.

                Ich werde hier das Ergebnis als Edit dann noch verlinken

                Comment


                • #9
                  Hi,

                  verwende lieber JAXB 2.0, dann hast du alles viel einfacher.

                  http://books.google.de/books?id=k3S_...20buch&f=false

                  Comment


                  • #10
                    Wie könnte ihm das etwas nützen? Sollte er erst ein Datenmodell von der XML-Struktur entwerfen?
                    Christian

                    Comment


                    • #11
                      Originally posted by jado View Post
                      Hi,

                      verwende lieber JAXB 2.0, dann hast du alles viel einfacher.

                      http://books.google.de/books?id=k3S_...20buch&f=false
                      Also ich finde JDom schon sehr einfach

                      Hatte bis jetzt nie Probleme damit und empfinde es als sehr Benutzerfreundlich.

                      Hier noch das Ergebnis:
                      CoRG ist (noch) nicht sonderlich gut, hab aber ja auch noch Zeit zum lernen

                      Comment


                      • #12
                        JAXB ist dafür ungeeignet! Völlig anderes Anwendungsfeld
                        Christian

                        Comment


                        • #13
                          Bekomme Fehler:

                          java.io.FileNotFoundException: C:\Programme\Game\Neue\standart\quest.quest (Das System kann den angegebenen Pfad nicht finden)

                          und
                          "bei der Engine geht das, beim Editor bleibt das Programm aber am Laufen, obwohl kein Fenster mehr offen ist"

                          Schau dir mal das Swing-Tutorial zum Thema JFrame an...
                          Christian

                          Comment


                          • #14
                            Originally posted by Christian Marquardt View Post
                            Bekomme Fehler:

                            java.io.FileNotFoundException: C:\Programme\Game\Neue\standart\quest.quest (Das System kann den angegebenen Pfad nicht finden)

                            und
                            "bei der Engine geht das, beim Editor bleibt das Programm aber am Laufen, obwohl kein Fenster mehr offen ist"

                            Schau dir mal das Swing-Tutorial zum Thema JFrame an...
                            Ist mir inzwischen auch Klar geworden, sind ja noch ANDERE Fenster offen

                            und der Pfadfehler ist darauf zurückzuführen das im ordner standart keine quest.quest vorhanden ist, welche für jede Quest den hauptbestandteil bildet worein beim Exportieren antworten und kreise eingebettet werden, sowie die verknüpfungen für die Engine damit sie weiss welche Quests das folgen

                            Eins muss man euch lassen, antworten lassen nicht lange auf sich warten, danke nochmals für die Hilfe, inzwischen hab ich auch noch ein bisschen erweitert und verbessert

                            Comment

                            Working...
                            X