Avatar billede esset Nybegynder
29. november 2003 - 15:59 Der er 12 kommentarer og
1 løsning

Modtager fejl i forb. med XML programmering

Jeg har flg. (udsnit) kode der giver fejl.

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

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder dbuild = dbf.newDocumentBuilder();
doc = dbuild.parse(en inputstream);
NodeList nl = doc.getChildNodes();
Node n = nl.item(0);
System.out.println(n.getNodeValue());

Når jeg afvikler koden får jeg denne fejl:

Caused by: javax.xml.parsers.FactoryConfigurationError: Provider for javax.xml.parsers.DocumentBuilderFactory cannot be found
    at javax.xml.parsers.DocumentBuilderFactory.newInstance(Unknown Source)

Det er åbenbart allerede i første linie - DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); at fejlen opstår.

Hvad gør jeg galt ??
Avatar billede arne_v Ekspert
29. november 2003 - 16:37 #1
Hvilken Java version ?  Og hvis <1.4 hvilke jar filer i classpath ?
Avatar billede esset Nybegynder
29. november 2003 - 16:40 #2
Det er version 1.3.1 (hvilken skal benyttes til dette) og jeg har flg. filer i classpath:

dom.jar
jaxp-api.jar
sax.jar
umapi.jar
xalan.jar
xercesImpl.jar
xml-apis.jar
xsltc.jar

Det må næsten være en helgardering ;o)
Avatar billede arne_v Ekspert
29. november 2003 - 17:13 #3
Måske er der et samspils-problem mellem nogen af dem.

Kan du ike prøve med kun xml-apis.jar og xercesIMpl.jar i classpath ?
Avatar billede esset Nybegynder
29. november 2003 - 17:32 #4
Har prøvet det - virkede ikke. Skal de øvrige filer ikke være tilgængelige overhovedet (slettes fra projektet)??
Avatar billede arne_v Ekspert
29. november 2003 - 17:42 #5
Hvad der nu er nødvendigt for at de ikke er i classpath.
Avatar billede arne_v Ekspert
29. november 2003 - 17:44 #6
Din IDE sætter formentlig en -classpath til alle d ejar filer der er i
projektet.
Avatar billede esset Nybegynder
29. november 2003 - 18:17 #7
Det virkede heller ikke. Har fundet flg. info om DocumentBuilderFactory. Det kunne godt se ud som om det er det der går galt, men hvad er det lige det betyder??

Obtain a new instance of a DocumentBuilderFactory. This static method creates a new factory instance. This method uses the following ordered lookup procedure to determine the DocumentBuilderFactory implementation class to load:
Use the javax.xml.parsers.DocumentBuilderFactory system property.
Use the properties file "lib/jaxp.properties" in the JRE directory. This configuration file is in standard java.util.Properties format and contains the fully qualified name of the implementation class with the key being the system property defined above.
Use the Services API (as detailed in the JAR specification), if available, to determine the classname. The Services API will look for a classname in the file META-INF/services/javax.xml.parsers.DocumentBuilderFactory in jars available to the runtime.
Platform default DocumentBuilderFactory instance.
Once an application has obtained a reference to a DocumentBuilderFactory it can use the factory to configure and obtain parser instances.
Avatar billede arne_v Ekspert
29. november 2003 - 18:24 #8
Jeg har brugt 1.3.1 og xml-apis.jar + xercesImpl.jar masser af gange.

Det skal virke helt uden krumspring.
Avatar billede esset Nybegynder
29. november 2003 - 21:16 #9
Har nu prøvet at lave en nyt projekt som kører fint som du nævnte. Problemet er bare at jeg skal afvikle det på en SAP Portal server, hvilket den åbenbart ikke er helt interesseret i ;o(

Kender du en anden god parser jeg evt. kan benytte (og evt. et lille eks. på hvordan jeg laver samme med den) ??

Og af ren nysgerrighed, hvordan får jeg så trukket indholdet ud af en node. Se min kode nedenfor:

import java.io.*;
import java.util.*;

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

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class Test {

    public static void main(String[] args) throws Exception {
        InputStream io = new FileInputStream("c:\\data\\download\\hytte.xml");
       
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder dbuild = dbf.newDocumentBuilder();
        Document doc = dbuild.parse(io);
        NodeList nl = doc.getChildNodes();
        System.out.println(nl.getLength());
        Node n = nl.item(0);
        nl = n.getChildNodes();
        System.out.println(nl.getLength());
        n = nl.item(1);
        System.out.println(n.getNodeValue());
        System.out.println(n.getNodeName());
    }
}
Avatar billede esset Nybegynder
29. november 2003 - 21:17 #10
Du har iøvrigt fortjent dine point, så læg besvarelsen af ovenstående som et svar....
Avatar billede arne_v Ekspert
29. november 2003 - 21:23 #11
javax.xml og org.w3c pakkerne er standardiseret, så de bør være
præcis de samme uanset hvilket XML library du bruger.

Problemet er formentligt at der kommer noget ind i classpath før
Xerces.

Jeg tror ikke at det er et andet library og kod eændringer der skal til.

Muligvis skal du ind og definere noget i den jaxp.properties
(jævnfør dit indlæg ovenfor) for at tvinge den til at bruge Xerces
implementation.

Men ellers skal du måske lidt i dybden med alle de XML libraries og
hvordan de konfigureres.

Det bliver sikkert ikke nemt.
Avatar billede arne_v Ekspert
29. november 2003 - 21:23 #12
svar
Avatar billede arne_v Ekspert
29. november 2003 - 21:26 #13
Med hendyn til udtræk så prøv f.eks. at se dette eksempel:

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) {
      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("<elm>");
        pw.println("<key>1</key>");
        pw.println("<val>a</val>");
        pw.println("</elm>");
        pw.println("<elm>");
        pw.println("<key>2</key>");
        pw.println("<val>bb</val>");
        pw.println("</elm>");
        pw.println("<elm>");
        pw.println("<key>3</key>");
        pw.println("<val>ccc</val>");
        pw.println("</elm>");
        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));
        NodeList elements = doc.getElementsByTagName("elm");
        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("key")) {
                  System.out.println("key = " + subelements.item(j).getFirstChild().getNodeValue());
              }
              if(tag.equals("val")) {
                  System.out.println("val = " + 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 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