Announcement

Collapse
No announcement yet.

XML decodieren

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

  • XML decodieren

    Hallo,

    ich habe eine XML. Schematischer Aufbau :

    <?xml version="1.0" encoding="UTF-8"?>
    <a>
    <b> //uninteressant
    <b1></b1>
    <b2></b2>
    ...
    </b>
    <c>
    <d check="true" name="test1"/>
    <d check="false" name="test2"/>
    ...
    </c>
    <a>

    Jetzt versuche ich es damit : http://javarevisited.blogspot.de/201...-tutorial.html auszulesen. Habe aktuell den Wurzelknoten, also 'a'

    Jetzt greife ich mit
    NodeList nodes = doc.getElementsByTagName("c"); auf den c Tag zu. Die Länge der NodeList=1, weil c ja nur einmal vorkommt. Wie aber lese ich jetzt die einzelnen d Zeilen aus? Nach dem Beispiel geht das nicht, da müsste der Aufbau wie bei 'b' sein. Kann mir da jemand nen Denkanstoß geben, bitte.

  • #2
    Bei dem Link bekomme ich keine vernünftige Seite angezeigt;jedenfalls keine Seite mit irgendeinem Quelltext

    Generell ist es sinnvoll mit einem XPATH-Ausdruck zu arbeiten

    http://www.w3schools.com/xpath/xpath_syntax.asp

    Code:
    public static void main(String[] args) throws ParserConfigurationException,SAXException,IOExcept ion,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("//d");
    NodeList nl=(NodeList)expr.evaluate(doc,XPathConstants.NODE SET);
    for(int i=0;i<nl.getLength();i++)
    {
    System.out.println(nl.item(i).getAttributes().getNamedItem("check").getNodeValue());
    }
    }

    Ausgabe:

    true
    false

    Es werden keine zusätzlichen Libs benötigt.
    Zuletzt editiert von Christian Marquardt; 29.12.2022, 22:11.
    Christian

    Comment


    • #3
      Vielen Dank, habe das jetzt mit XPath umgesetzt. Kannte ich vorher noch nicht. Allerdings bekomme ich keine Ausgabe, weil nl.getLength() = 0 ist. Ich übergebe ja den filename, also den Pfad der Datei, wahrscheinlich ist der nicht richtig. Wie erhalte ich denn den aktuellen Projektpfad?

      Comment


      • #4
        Dann solltest du die Exception nicht wegdrücken, sondern behandeln

        http://www.mindspring.com/~mgrand/ja...properties.htm
        Christian

        Comment


        • #5
          Habe doch keine ERxception weggedrückt...

          Hatte es mit :
          Code:
          String filename = this.getServletContext().getRealPath("test.xml");
          versucht. Dort liegt auch die Datei zum Testen. Trotzdem erhalte ich bei

          Code:
          Document doc = dBuilder.parse(new File(filename));
          doc.getDocumentElement().normalize();
          System.out.println(doc);
          nur: [#document: null]

          Aber wenn ich mir
          Code:
          System.out.println("root of xml file: " + doc.getDocumentElement().getNodeName());
          ausgeben lasse, bekomme ich den richtigen Root, d.h. ja, dass die Datei gefunden wurde. Was ist denn dann kaputt?
          Zuletzt editiert von Chickaria; 16.04.2013, 14:40.

          Comment


          • #6
            a) vielleicht mal erwähnen, dass es um eine Webanwendung geht
            b) und? mal filename ausgegeben/geloggt? Würde this.getServletContext().getRealPath("/"); ermitteln und dann das XML ranhängen
            Christian

            Comment


            • #7
              a) Sorry, war ja aber erst ab der Pfadgeschicht wichtig, oder?
              b) filename ist korrekt.

              Woran kann es denn noch liegen?

              Comment


              • #8
                Hier noch der aktuelle Code, vlt. ist irgendwo was falsch, was ich ncht sehe:

                Code:
                public XPathTest(String filename)throws ParserConfigurationException,SAXException,IOException,XPathExpressionException {
                		 
                		try {
                			DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
                			dbf.setNamespaceAware(true);
                		    DocumentBuilder db=dbf.newDocumentBuilder();
                		    Document doc=db.parse(filename);
                		    doc.getDocumentElement().normalize();
                		    
                		    XPathFactory factory=XPathFactory.newInstance();
                		    XPath xpath=factory.newXPath();
                		    XPathExpression expr=xpath.compile("//d");
                		    NodeList nl = (NodeList)expr.evaluate(doc,XPathConstants.NODESET);
                		    for(int i=0;i<nl.getLength();i++)
                		        {
                		        System.out.println(nl.item(i).getAttributes().getNamedItem("check").getNodeValue());
                		        }
                		} catch (Exception ex) {
                			ex.printStackTrace();
                                }
                }

                Comment


                • #9
                  Habe doch keine ERxception weggedrückt
                  Sicherlich tust du das!

                  public XPathTest(String filename)throws ParserConfigurationException,SAXException,IOExcept ion,XPathExpressionException {
                  Vielleicht mal eine Exceptionbehandlung einfügen
                  Christian

                  Comment


                  • #10
                    ach gott..throws hatte ich ganz übersehen.... habe das ganze throws rausgenommen

                    mit catch(Exception ex) mache ich doch schon eine Exceptionbehandlung oder nicht? Auf jeden Fall "springt" er nicht dort rein.

                    Comment


                    • #11
                      Schon mal debuggt?
                      Christian

                      Comment


                      • #12
                        ja, aber mir fällt nichts auf außer, dass ab

                        Code:
                        NodeList nl = (NodeList)expr.evaluate(doc,XPathConstants.NODESET);
                        nl immer noch leer ist. Worauf könnte man noch achten?

                        Comment


                        • #13
                          Dann gibt es halt keine Knoten die "d" heissen.

                          Erstelle in einem extra Projekt eine Teststellung mit eine Mainklasse und dem Code darin. Test das dann in dem du die Datei direkt lädst
                          Christian

                          Comment


                          • #14
                            Eine Nacht darüber schlafen wirkt Wunder...Natürlich gibt es keine Knoten, die 'd' heißen, war ja nur ein Bsp....wie blöd

                            Vielen Dank aber für deine Geduld.

                            Comment


                            • #15
                              Hallo,

                              ich habe noch eine kurze Frage zu XPath.

                              Wenn ich einen solchen XML Aufbau habe :

                              <a>
                              <b>
                              <c val="1">
                              <d ../>
                              <d ../>
                              usw.
                              </c>
                              <c val="2">
                              <d ../>
                              <d ../>
                              usw.
                              </c>
                              </b>
                              </a>

                              Wie lese ich dann die d Parameter für jedes einzelne c aus? Also, zu c mit dem val 1 gehören dann ja andere d´s wie zu c mit value 2. Im vorherigen Beispiel hätte ich doch alle d´s in einer NodeList und kann die ja dann nicht mehr den einzelnen c´s zuordnen.

                              Comment

                              Working...
                              X