Announcement

Collapse
No announcement yet.

XML öffnen, lesen und ändern

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

  • XML öffnen, lesen und ändern

    Hallo,

    ich habe eine XML.
    ..
    <a val = XX>
    <b val=1>
    <b val=2>
    </a>
    ..

    Die lese ich wie folgt aus:

    Code:
    public static void main(String[] args) throws ParserConfigurationException,SAXException,IOException,XPathExpressionException
        {
        DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
        DocumentBuilder db=dbf.newDocumentBuilder();
        Document doc=db.parse(new File("g:\\test.xml"));
        doc.getDocumentElement().normalize();
        XPathFactory factory=XPathFactory.newInstance();
        XPath xpath=factory.newXPath();
        XPathExpression expr=xpath.compile("//a");
        NodeList nl=(NodeList)expr.evaluate(doc,XPathConstants.NODESET);
        for(int i=0;i<nl.getLength();i++)
            {
            //tue etwas
            }
        }
    Meine Frage, wie kann ich einen neuen b-Tag nach dem letzten b-Tag (val=2) einfügen?

  • #2
    In dem du diesen mittels XPATH suchst - wie das geht hatten wir ja. Du bekommst dann kein NODESET zurück, sondern ein NODE. Der wird auf Node gecastet

    Node node=(Node)expr.evaluate(doc,XPathConstants.NODE);

    Der node hat dann die Methode appendChild mit dem ein Child eingefügt werden kann. Du suchst alslo nach a mit dem Attribut xx
    Christian

    Comment


    • #3
      Okay, mein erstes Problem...Ich weiß ja den value der b Knoten nicht. Ich muss halt nur den letzten b Knoten haben.

      Comment


      • #4
        Du kannst einen neuen b-Knoten nur unterhalb des a-Knoten einfügen. Dazu gibt es appendChild um den neuen Knoten anzuhängen oder insertBefore um den neuen Knoten vor einem anderen Childnode einzufügen. Um einen neuen b-Knoten anzuhängen ist also die Kenntnis der vorhandenen unnötig. Musst du allerdings einen b-Knoten mit val=3 einfügen musst du halt erst alle b-Knoten lesen - auch das hatten wir schon - die höchste Nummer ermitteln und deinen neuen b-Knoten mit dieser Nummer +1 als Kind des a-Knoten anhängen
        Zuletzt editiert von Christian Marquardt; 24.04.2013, 14:08.
        Christian

        Comment


        • #5
          Okay.Habe alles hinbekommen, Dank für den Anstoß

          Comment


          • #6
            Leider hat sich ein anderen (kleines) Problem aufgetan:

            <a>
            <b>
            <c test="12">
            <d>
            <d>
            ...
            </c>
            <c>
            ...
            </c>
            </b>
            </a>

            Ich habe schon eine Liste (nl) mit den c Knoten. Nun möchte ich den Wert des Attributs "test" ändern. Leider komme ich da nicht voran. Wie mache ich das am schlausten?
            Habe es wie folgt versucht:

            nl.item(i).getAttributes().getNamedItem("test").se tNodeValue("15");

            Comment


            • #7
              Wenn es nur ein "kleines" Problem ist, wirst du es ja selbst hinbekommen? Dann gibt es ja noch die Klasse Element und die Methoden setAttribute http://docs.oracle.com/javase/6/docs...m/Element.html und wie es der Zufall will, ist item(i) genau so ein Element Und weiterer Zufall, bei Benutzung von google findet man wirklich sowas wie http://www.f15ijp.com/2012/03/java-o...odes-elements/ erstaunlich
              Zuletzt editiert von Christian Marquardt; 25.04.2013, 10:15.
              Christian

              Comment


              • #8
                Beim aufmerksamen Lesen fällt auf, dass ich kein Attribut hinzufügen, sondern ändern will. Mein Code stimmt außerdem, ich habe nur vergessen, das document an DOMSource zu übergeben.

                Comment


                • #9
                  Wenn du es besser weißt.

                  Adds a new attribute. If an attribute with that name is already present in the element, its value is changed to be that of the value parameter.

                  Lies mal aufmerksamm die Doku

                  Du kriegst nichts selber gebacken, erst 3 Wochen C/C++, dann jetzt Java, kannst keine noch so einfache Programmlogik selbst entwickeln, kennst offenbar keine Codevervollständigung zum nachschauen, aber anderen sagen sie sollen lesen. Fein
                  Christian

                  Comment

                  Working...
                  X