Avatar billede rozet Nybegynder
12. oktober 2004 - 15:38 Der er 13 kommentarer og
1 løsning

XML vs java - org.apache.xerces.dom.DeferredElementNSImpl

Jeg har følgende ens kode i 2 forskellige java-applikationer:

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

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

DocumentBuilder builder = DocumentBuilder();
document = builder.parse( new File(argv[0]) );
NodeList test = document.getElementsByTagName("AFSNIT_drift_7_4");
System.out.println("NodeList test length: "+ test.getLength());
System.out.println("NodeList test item: "+ test.item(0));

for (int j = 0; j < test.getLength() ; j++) {
    Node element_2 = test.item(j);

    System.out.println(j+" - getClass().getName() - "+element_2.getClass().getName());
    System.out.println(j+" - getNodeName() - "+element_2.getNodeName());
    System.out.println(j+" - getNodeType() - "+element_2.getNodeType());
    System.out.println(j+" - getNodeValue() - \""+element_2.getNodeValue()+"\"");
    System.out.println(j+" - toString() - "+element_2.toString());
            }
==========

Hvordan kan det være at:

    System.out.println(j+" - getClass().getName() - "+element_2.getClass().getName());

program 1) skriver:

0 - getClass().getName() - org.apache.xerces.dom.DeferredElementNSImpl

og program 2) skriver:

0 - getClass().getName() - org.apache.crimson.tree.ElementNode2

--

Jeg skal bruge det til at hente teksten omgivet af(i dette tilfælde) tag-("AFSNIT_drift_7_4").

I program 2 går det fint, da jeg blot kan foretage en element_2.toString() for at få teksten ud..

Men i program 1 er element_2.toString() == null...

Hvorfor og hvordan kan det være at der er forskel på disse ellers identiske program stumper. Samt hvad gør jeg i program 1) for at få den "rigtige" tekst frem?

Hilsen Christian
Avatar billede arne_v Ekspert
12. oktober 2004 - 15:41 #1
Den en app kører med Xerces som XML parser og den anden kører med
Crimsom som XML parser !
Avatar billede arne_v Ekspert
12. oktober 2004 - 15:42 #2
JAXP er et rent API, hvor der findes forskellige implementationer.

De mest brugte er nok Xerces og Crimson.
Avatar billede arne_v Ekspert
12. oktober 2004 - 15:45 #3
Prøv at udskrive:

element_2.getFirstChild().getNodeValue()
Avatar billede rozet Nybegynder
12. oktober 2004 - 15:59 #4
getFirstChild().getNodeValue giver tom tekst tilbage, ligeledes med getLastChild().getNodeValue

Løsningen må vel enten være at få Crimsom_xml-parseren til at træde i kraft, der hvor jeg har brug for den eller på en eller anden måde at vha Xerces_xml-parseren, at få den rigtige tekst ud..

Hvor definerer man hvilken type parser der skal bruges?
Avatar billede arne_v Ekspert
12. oktober 2004 - 16:03 #5
Det undrer mig lidt. Umiddelbart burde det nemlig virke.

Hvilken version af xerces bruger du ?
Avatar billede arne_v Ekspert
12. oktober 2004 - 16:03 #6
Groft sagt mener jeg at den bare tager den som er først i classpath.
Avatar billede rozet Nybegynder
12. oktober 2004 - 16:09 #7
xercesImpl-2.0.2.jar
Avatar billede arne_v Ekspert
12. oktober 2004 - 16:15 #8
http://xml.apache.org/~edwingo/jaxp-faq.html


Q. How do I use a different JAXP compatible implementation?

The JAXP 1.1 API allows applications to plug in different JAXP compatible implementations of parsers or XSLT processors. For example, when an application wants to create a new JAXP DocumentBuilderFactory instance, it calls the staic method DocumentBuilderFactory.newInstance(). This causes a search for the name of a concrete subclass of DocumentBuilderFactory using the following order:

The value of a system property like javax.xml.parsers.DocumentBuilderFactory if it exists and is accessible.
The contents of the file $JAVA_HOME/jre/lib/jaxp.properties if it exists.
The Jar Service Provider discovery mechanism specified in the Jar File Specification. A jar file can have a resource (i.e. an embedded file) such as META-INF/services/javax.xml.parsers.DocumentBuilderFactory containing the name of the concrete class to instantiate.
The fallback platform default implementation.
Avatar billede arne_v Ekspert
13. oktober 2004 - 01:17 #9
test.xml:

<all>
<AFSNIT_drift_7_4>aa</AFSNIT_drift_7_4>
<AFSNIT_drift_7_4>bbbb</AFSNIT_drift_7_4>
<AFSNIT_drift_7_4>cccccc</AFSNIT_drift_7_4>
</all>

Parse.java:


import java.io.File;
import java.io.IOException;

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.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class Parse {
    private final static String XML_FILE = "C:\\test.xml";

    public static void main(String[] args) {
        try {
            //System.setProperty("javax.xml.parsers.DocumentBuilderFactory", "org.apache.xerces.jaxp.DocumentBuilderFactoryImpl");
            //System.setProperty("javax.xml.parsers.DocumentBuilderFactory", "org.apache.crimson.jaxp.DocumentBuilderFactoryImpl");
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
            Document doc = db.parse(new File(XML_FILE));
            NodeList elements = doc.getElementsByTagName("AFSNIT_drift_7_4");
            for (int i = 0; i < elements.getLength(); i++) {
                Node element = (Element) elements.item(i);
                System.out.println(element.getClass().getName());
                System.out.println(element.getNodeName());
                System.out.println(element.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
13. oktober 2004 - 01:18 #10
Uden xerces i classpath eller med crimson property sat:

org.apache.crimson.tree.ElementNode
AFSNIT_drift_7_4
aa
org.apache.crimson.tree.ElementNode
AFSNIT_drift_7_4
bbbb
org.apache.crimson.tree.ElementNode
AFSNIT_drift_7_4
cccccc
Avatar billede arne_v Ekspert
13. oktober 2004 - 01:18 #11
Med xerces i classpath og crimson property ikke sat:

org.apache.xerces.dom.DeferredElementImpl
AFSNIT_drift_7_4
aa
org.apache.xerces.dom.DeferredElementImpl
AFSNIT_drift_7_4
bbbb
org.apache.xerces.dom.DeferredElementImpl
AFSNIT_drift_7_4
cccccc
Avatar billede rozet Nybegynder
14. oktober 2004 - 08:46 #12
Fantastisk flg. hjalp mig:

            //System.setProperty("javax.xml.parsers.DocumentBuilderFactory", "org.apache.xerces.jaxp.DocumentBuilderFactoryImpl");
            //System.setProperty("javax.xml.parsers.DocumentBuilderFactory", "org.apache.crimson.jaxp.DocumentBuilderFactoryImpl");

Det løste ihvertfald problemet. Så du får ihvertfald pointene, flot!

Vil nu fedte lidt rundt, for at finde ud af, hvad jeg skal gøre med xerces-parseren for at få værdier ud der.. For det kan jeg ikke, dog ikke vigtigt.

Og hvordan er det nu lige man giver point..??
Avatar billede arne_v Ekspert
14. oktober 2004 - 10:56 #13
Jeg skal først ligge et svar
Avatar billede rozet Nybegynder
14. oktober 2004 - 13:02 #14
Det virker
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