Avatar billede pfp Nybegynder
04. marts 2004 - 21:18 Der er 21 kommentarer og
2 løsninger

Læs fra XML fil og udskriv

Hej Eksperter,

Følgende servlet returnerer et XML dokument:
http://dwebtek.daimi.au.dk:8080/mis/MetaServer?query

Som det kan ses har den strukturen:
<servers>
  <server>
    <userid>server1</userid>
    <description>server1</description>
  </server>
  <server>
    <userid>server2</userid>
    <description>server2</description>
  </server>
</servers>

Hvordan kan jeg i java læse denne xmlfil (XMLReader?) og så outputte en liste over servere?

Håber der er en der kan hjælpe..
Avatar billede riversen Nybegynder
04. marts 2004 - 21:26 #1
prøv noget ala

    try
    {
      DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
      DocumentBuilder db = dbf.newDocumentBuilder();

      org.w3c.dom.Document document = db.parse( new URL( "sti" ).openStream() );
    }
    catch( ParserConfigurationException pce ){ pce.printStackTrace(); }
    catch( SAXException saxe ){ saxe.printStackTrace(); }

herefter kan du arbejde med document objektet.
Avatar billede simonvalter Praktikant
04. marts 2004 - 21:28 #2
vil sax ikke være bedre, hvis der bare skal læses og outputtes ?

du kan evt læse arne_v's artikel om emnet.
http://www.eksperten.dk/artikler/100
Avatar billede pfp Nybegynder
04. marts 2004 - 21:44 #3
riversen -> Jeg forstår ikke rigtig hvordan jeg skal bruge din.

loadet -> Jeg har prøvet lidt med Arne's artikel:

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
import org.jdom.*;
import org.jdom.input.*;
import org.jdom.output.*;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.List;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.adapters.DOMAdapter;
import org.jdom.adapters.XercesDOMAdapter;
import org.jdom.input.DOMBuilder;

public class listall
    extends HttpServlet {
 
  //Initialize global variables
  public void init() throws ServletException {
  }
   
    private final static String XML_FILE = "http://dwebtek.daimi.au.dk:8080/mis/MetaServer?query";
  //Process the HTTP Get request
  public void doGet(HttpServletRequest request, HttpServletResponse response) throws
      ServletException, IOException {
             
    try {
            DOMAdapter da = new XercesDOMAdapter();
            org.w3c.dom.Document w3cdoc = da.getDocument(new FileInputStream(XML_FILE), false);
            org.apache.xml.utils.DOMBuilder b = new org.apache.xml.utils.DOMBuilder(); 
            org.w3c.dom.Document doc = b.build(w3cdoc);     
            List list = doc.getRootElement().getChildren();
            for (int i = 0; i < list.size(); i++) {     
                Element elm = (Element) list.get(i);       
                //String no = elm.getAttributeValue("no");     
                String userid = elm.getChild("userid").getText();     
                //String address = elm.getChild("adresse").getText();
                //System.out.println("no=" + no);         
                System.out.println("navn=" + userid);         
                //System.out.println("adresse=" + address);   
            }        }
           
            catch (Exception e) {
            e.printStackTrace();
        }
  }

  //Process the HTTP Post request
  public void doPost(HttpServletRequest request, HttpServletResponse response) throws
      ServletException, IOException {
    doGet(request, response);
  }
}

Men det vil ikke compile. Jeg får disse 3 errors:
listall.java:34: cannot resolve symbol
symbol  : constructor DOMBuilder ()
location: class org.apache.xml.utils.DOMBuilder
                        org.apache.xml.utils.DOMBuilder b = new org.apache.xml.utils.DOMBuilder();
                                                            ^
listall.java:35: cannot resolve symbol
symbol  : method build (org.w3c.dom.Document)
location: class org.apache.xml.utils.DOMBuilder
                        org.w3c.dom.Document doc = b.build(w3cdoc);
                                                    ^
listall.java:36: cannot resolve symbol
symbol  : method getRootElement ()
location: interface org.w3c.dom.Document
                        List list = doc.getRootElement().getChildren();
Avatar billede arne_v Ekspert
04. marts 2004 - 21:46 #4
Her er et eksempel med W3C DOM som læser din XML fil:

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.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:\\domtest.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("server");
        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("userid")) {
                  System.out.println("userid = " + subelements.item(j).getFirstChild().getNodeValue());
              }
              if(tag.equals("description")) {
                  System.out.println("description = " + 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
04. marts 2004 - 21:50 #5
Men hvis du hellere vil arbejde videre på dit JDOM eksempel, så ser det ud
som at du mangler Xerces i din classpath !
Avatar billede arne_v Ekspert
04. marts 2004 - 21:52 #6
Hm - måske alligevel ikke.

Snarere skal:

org.w3c.dom.Document doc = b.build(w3cdoc);     
           
være:

Document doc = b.build(w3cdoc);     

således at doc bliver et JDOM document og ikke et W3C document.
Avatar billede riversen Nybegynder
04. marts 2004 - 21:52 #7
prp: vha. de forskellige metoder der findes til org.w3c.dom.Document kan du hente de nødvendige oplysninger og outputte dem som du ønsker.
Avatar billede riversen Nybegynder
04. marts 2004 - 21:52 #8
pfp even :-)
Avatar billede arne_v Ekspert
04. marts 2004 - 21:54 #9
Prøv og lav den rettelse af Document og så put Xerces i classpath (for servlet
betyder det at de 2 jar filer skal i din web apps lib directory).
Avatar billede pfp Nybegynder
04. marts 2004 - 22:32 #10
arne -> hvor finder jeg de 2 jar filer?
Avatar billede arne_v Ekspert
04. marts 2004 - 22:35 #11
Man kan bl.a. downloade Xerces separat.

Men prøv først:

C:\jdom-b10\lib

og kig efter:

xerces.jar
xml-apis.jar
Avatar billede pfp Nybegynder
04. marts 2004 - 22:40 #12
Nu fik jeg dem i min classpath.

Min kode ser nu sådan ud:
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;import java.util.List;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.adapters.DOMAdapter;
import org.jdom.adapters.XercesDOMAdapter;
import org.jdom.input.DOMBuilder;
public class test {
    private final static String XML_FILE = "test.xml";
    public static void main(String[] args) {
        try {
            DOMAdapter da = new XercesDOMAdapter();
            org.w3c.dom.Document w3cdoc = da.getDocument(new FileInputStream(XML_FILE), false);
            org.apache.xml.utils.DOMBuilder b = new org.apache.xml.utils.DOMBuilder();
            Document doc = b.build(w3cdoc);
            List list = doc.getRootElement().getChildren();
            for (int i = 0; i < list.size(); i++) {
                Element elm = (Element) list.get(i);
                String no = elm.getAttributeValue("no");
                String name = elm.getChild("navn").getText();
                String address = elm.getChild("adresse").getText();
                System.out.println("no=" + no);
                System.out.println("navn=" + name);
                System.out.println("adresse=" + address);
            }        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (JDOMException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Men jeg får stadig 2 errors:
test.java:16: cannot resolve symbol
symbol  : constructor DOMBuilder ()
location: class org.apache.xml.utils.DOMBuilder();
            org.apache.xml.utils.DOMBuilder
der();

test.java:17: cannot resolve symbol
symbol  : method build (org.w3c.dom.Document
location: class org.apache.xml.utils.DOMBuil
            Document doc = b.build(w3cdoc);
Avatar billede arne_v Ekspert
04. marts 2004 - 22:50 #13
org.apache.xml.utils.DOMBuilder er vist ikke en Xerces klasse
men en Xalan klasse.

C:\jdom-b10\lib

xalan.jar
Avatar billede pfp Nybegynder
04. marts 2004 - 22:58 #14
har lagt xalan ind i C:\j2sdk1.4.2_02\jre\lib\ext men samme errors
Avatar billede arne_v Ekspert
04. marts 2004 - 23:03 #15
Er det der du har smidt de andre jar filer ?
Avatar billede arne_v Ekspert
04. marts 2004 - 23:04 #16
Iøvrigt matcher tag navnene i den kode vist ikke din XML fil.
Avatar billede pfp Nybegynder
04. marts 2004 - 23:05 #17
Ja det er der jeg har smidt de andre. Tjekker lige med tagsne.
Avatar billede pfp Nybegynder
04. marts 2004 - 23:06 #18
Jo det skulle passe med taggsne for i det her forsøg har jeg kopieret xml filen fra din artikel.
Avatar billede arne_v Ekspert
04. marts 2004 - 23:08 #19
Mystisk !

C:\jdom-b10\lib>jar tvf xalan.jar | grep DOMBuilder
  7346 Sun Mar 02 00:51:50 CET 2003 org/apache/xml/utils/DOMBuilder.class
Avatar billede arne_v Ekspert
04. marts 2004 - 23:09 #20
OK - jeg sammenlignede med XML'en fra dit spørsgmål - sorry
Avatar billede pfp Nybegynder
04. marts 2004 - 23:10 #21
Ja det er lidt mystisk
Avatar billede pfp Nybegynder
07. marts 2004 - 11:49 #22
arne_v jeg har fået det til at virke med et af dine andre eksempler fra artiklen. Smid et svar.
Avatar billede arne_v Ekspert
07. marts 2004 - 11:52 #23
OK
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