Avatar billede jetrit Nybegynder
03. september 2003 - 14:49 Der er 6 kommentarer og
1 løsning

gennemløb af DOM-træ

hej der jeg har et xml dokument jeg skal have læst ind i nogle klasser
xml:
<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "skabelon.dtd">
<skabelon>
<baggrund url="jens.jpg" />
<tekstelement>
  <titel>
  navn
  </titel>
  <beskrivelse>
  her intastes personens fulde navn
  </beskrivelse>
  <tekst SB="nej">
  Jens Carlsen
  </tekst>
  <kordinater x="20" y="40" />
  <sktifttype>arial
  </sktifttype>
  <farve>
  blue
  </farve>
</tekstelement>

<tekstelement>
  <titel>
  titel
  </titel>
  <beskrivelse>
  her skal du intaste din danske titel
  </beskrivelse>
  <tekst SB="nej">
  over onanist
  </tekst>
  <kordinater x="20" y="60" />
  <sktifttype>
  arial
  </sktifttype>
  <farve>
  blue
  </farve>
</tekstelement>
</skabelon>

alt dette skal så lægges ind med en først der sætter baggrund derefter køre en for lykke over <tekstelement> og sætte ind med f.eks te.setTittel(???).

jeg er kommet så langt at jeg har læst xmlen ind og fået den til at iterere over tekst elementerne, men jeg kan ikke få den til at købe igennem under træet (tittel beskrivelse...)

java:
    try {
      DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
      DocumentBuilder db = dbf.newDocumentBuilder();
      Document doc = db.parse(new File(filename));
      Element rootElement = doc.getDocumentElement();
      NodeList nl =doc.getElementsByTagName("tekstelement");
     
     
      System.out.println( nl.item(0).getNodeName());

kan jeg ikke komme vidre ned ved at skrive nl.item(0).getChildNodes() kan i ikke give mig et godt eksempel på navigering i strukturen??
Avatar billede arne_v Ekspert
03. september 2003 - 14:53 #1
Jeg har et par eksempler liggende.
Avatar billede arne_v Ekspert
03. september 2003 - 14:53 #2
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.FactoryConfigurationError;
import javax.xml.parsers.ParserConfigurationException;

import org.apache.xml.serialize.XMLSerializer;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class DomTest2 {
  private final static String XML_FILE = "C:\\domtest.xml";
  public static void main(String[] args) {
      ArrayList data1 = new ArrayList();
      data1.add("a1");
      data1.add("b2");
      data1.add("c3");
      data1.add("d4");
      writeXml(data1, XML_FILE);
      ArrayList data2 = readXml(XML_FILE);
      System.out.println(data2);
  }
  private static void writeXml(ArrayList data, String filename) {
      try {
        PrintWriter pw = new PrintWriter(new FileOutputStream(filename));
        pw.println("<?xml version='1.0' standalone='yes'?>");
        pw.println("<arraylist>");
        for (int i = 0; i < data.size(); i++) {
            pw.println(
              "  <element>" + (String) data.get(i) + "</element>");
        }
        pw.println("</arraylist>");
        pw.close();
      } catch (FileNotFoundException e) {
        e.printStackTrace();
      }
  }
  private static ArrayList readXml(String filename) {
      ArrayList result = new ArrayList();
      try {
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document doc = db.parse(new File(filename));
        NodeList elements = doc.getElementsByTagName("element");
        for (int i = 0; i < elements.getLength(); i++) {
            Node element = elements.item(i);
            result.add(element.getFirstChild().getNodeValue());
        }
        XMLSerializer ser = new XMLSerializer(System.out, null);
        ser.serialize(doc.getDocumentElement());
      } catch (FactoryConfigurationError e) {
        e.printStackTrace();
      } catch (ParserConfigurationException e) {
        e.printStackTrace();
      } catch (SAXException e) {
        e.printStackTrace();
      } catch (IOException e) {
        e.printStackTrace();
      }
      return result;
  }
}
Avatar billede arne_v Ekspert
03. september 2003 - 14:54 #3
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.FactoryConfigurationError;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.traversal.DocumentTraversal;
import org.w3c.dom.traversal.NodeFilter;
import org.w3c.dom.traversal.TreeWalker;
import org.xml.sax.SAXException;

public class Walker {
  private final static String XML_FILE = "C:\\walktest.xml";
  public static void main(String[] args) {
      writeXml(XML_FILE);
      readXml(XML_FILE);
  }
  private static void writeXml(String filename) {
      try {
        PrintWriter pw = new PrintWriter(new FileOutputStream(filename));
        pw.println("<?xml version='1.0' standalone='yes'?>");
        pw.println("<list>");
        pw.println("<!-- first element -->");
        pw.println("<element>element 1</element>");
        pw.println("<!-- second element -->");
        pw.println("<element>element 2</element>");
        pw.println("</list>");
        pw.close();
      } catch (FileNotFoundException e) {
        e.printStackTrace();
      }
  }
  private static void readXml(String filename) {
      try {
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document doc = db.parse(new File(filename));
        // oldfashioned way
        NodeList elements = doc.getElementsByTagName("element");
        for (int i = 0; i < elements.getLength(); i++) {
            Node element = elements.item(i);
            System.out.println(element.getFirstChild().getNodeValue());
        }
        System.out.println("----------");
        // walk everything
        TreeWalker walk1 = ((DocumentTraversal)doc).createTreeWalker(doc.getDocumentElement(), NodeFilter.SHOW_ALL, null, false);
        Node n1;
        while((n1 = walk1.nextNode()) != null) {
            int type = n1.getNodeType();
            String name = n1.getNodeName();
            String value = n1.getNodeValue();
            if (value != null) {
                value = value.replace('\n', ' ');
            } else {
                value = "";
            }
            System.out.println(type + " " + name + " " + value);
        }
        System.out.println("----------");
        // walk everything but comments
        TreeWalker walk2 = ((DocumentTraversal)doc).createTreeWalker(doc.getDocumentElement(), NodeFilter.SHOW_ALL & ~NodeFilter.SHOW_COMMENT, null, false);
        Node n2;
        while((n2 = walk2.nextNode()) != null) {
            int type = n2.getNodeType();
            String name = n2.getNodeName();
            String value = n2.getNodeValue();
            if (value != null) {
                value = value.replace('\n', ' ');
            } else {
                value = "";
            }
            System.out.println(type + " " + name + " " + value);
        }
        System.out.println("----------");
        // walk all text that are child to element
        TreeWalker walk3 = ((DocumentTraversal)doc).createTreeWalker(doc.getDocumentElement(), NodeFilter.SHOW_TEXT, new Filter(), false);
        Node n3;
        while((n3 = walk3.nextNode()) != null) {
            int type = n3.getNodeType();
            String name = n3.getNodeName();
            String value = n3.getNodeValue();
            if (value != null) {
                value = value.replace('\n', ' ');
            } else {
                value = "";
            }
            System.out.println(type + " " + name + " " + value);
        }
      } catch (FactoryConfigurationError e) {
        e.printStackTrace();
      } catch (ParserConfigurationException e) {
        e.printStackTrace();
      } catch (SAXException e) {
        e.printStackTrace();
      } catch (IOException e) {
        e.printStackTrace();
      }
  }
}

class Filter implements NodeFilter {
    public short acceptNode(Node node) {
        if(node.getNodeType() == Node.TEXT_NODE &&
          node.getParentNode().getNodeType() == Node.ELEMENT_NODE &&
          node.getParentNode().getNodeName().equals("element")) {
              return NodeFilter.FILTER_ACCEPT;
          } else {
              return NodeFilter.FILTER_REJECT;
          }
    }
}
Avatar billede arne_v Ekspert
03. september 2003 - 14:59 #4
Det viser ihvertfald hvordan du får løbet igennem et XML dokument.

Du skal selvfølgelig lave noget kode specifikt til din XML.
Avatar billede arne_v Ekspert
03. september 2003 - 15:19 #5
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.FactoryConfigurationError;
import javax.xml.parsers.ParserConfigurationException;

import org.apache.xml.serialize.XMLSerializer;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class DomTest4 {
  private final static String XML_FILE = "C:\\test.xml";
  public static void main(String[] args) {
      readXml(XML_FILE);
  }
  private static void readXml(String filename) {
      try {
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document doc = db.parse(new File(filename));
        NodeList elements = doc.getElementsByTagName("tekstelement");
        for (int i = 0; i < elements.getLength(); i++) {
            Node element = elements.item(i);
            NodeList subelements = element.getChildNodes();
            for(int j = 0; j < subelements.getLength(); j++) {
                String tag = subelements.item(j).getNodeName();
                if(tag.equals("titel")) {
                    System.out.println("titel = " + subelements.item(j).getFirstChild().getNodeValue());
                }
                // ...
                if(tag.equals("farve")) {
                    System.out.println("farve = " + subelements.item(j).getFirstChild().getNodeValue());
                }
            }     
        }
      } catch (FactoryConfigurationError e) {
        e.printStackTrace();
      } catch (ParserConfigurationException e) {
        e.printStackTrace();
      } catch (SAXException e) {
        e.printStackTrace();
      } catch (IOException e) {
        e.printStackTrace();
      }
      return;
  }
}
Avatar billede arne_v Ekspert
03. september 2003 - 15:20 #6
Ovenstående kode kører på din XML fil.
Avatar billede jetrit Nybegynder
03. september 2003 - 15:53 #7
tak kikker på det
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester