/ Forside / Teknologi / Udvikling / Java / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java
#NavnPoint
molokyle 3688
Klaudi 855
strarup 740
Forvirret 660
gøgeungen 500
Teil 373
Stouenberg 360
vnc 360
pmbruun 341
10  mccracken 320
Sær opførsel af SAXParser
Fra : Morten Green Hermans~


Dato : 26-07-01 16:40

Jeg prøver lige igen. Mit tidligere spørgsmål stank

Tag lige en kikker på følgende kode (kun til jdk1.4):

----------------------------------------------
import java.io.*;
import org.xml.sax.*;
import org.xml.sax.helpers.*;
import javax.xml.parsers.*;

public class Echo extends DefaultHandler
{
public static void main(String argv[])
{
SAXParserFactory factory = SAXParserFactory.newInstance();

try
{
SAXParser saxParser = factory.newSAXParser();
saxParser.parse(System.in, new Echo());
}
catch(Throwable t)
{
t.printStackTrace();
}
}

public void startDocument() throws SAXException
{
System.out.println("START DOCUMENT");
}

public void endDocument() throws SAXException
{
System.out.println("END DOCUMENT");
}

public void startElement(String namespaceURI, String lName,
   String qName,
Attributes attrs) throws SAXException
{
System.out.println("START: " + qName);
}

public void endElement(String namespaceURI, String sName,
   String qName)
throws SAXException
{
System.out.println("END: " + qName);
}
}
-----------------------------------------------

Hvis jeg nu kører:
echo "<?xml version='1.0' encoding='us-ascii'?><I><O></O></I>" | java Echo

Får jeg:
(* er det jeg skriver, # er det computeren skriver)

# START DOCUMENT
# START: I
# START: O
# END: O
# END: I
# END DOCUMENT

Som forvented.

Kører jeg (og indtaster selv): java Echo
(* er det jeg skriver, # er det computeren skriver)

* <?xml version='1.0' encoding='us-ascii'?>
# START DOCUMENT
* <I>
* <O>
* </O>
* </I>
(her trykker jeg CRTL-d (End-of-file))
# START: I
# START: O
# END: O
# END: I
# END DOCUMENT

Se! Det beviser at parseren kun kører efter at den har fået end of file.
Det jeg vil have er at den skal parse videre så snart den har noget
mere. Det er jo det der gør en seriel parser forskellig fra en DOM parser.
Det skal se sådan ud:

* <?xml version='1.0' encoding='us-ascii'?>
# START DOCUMENT
* <I>
# START: I
* <O>
# START: O
* </O>
# END: O
* </I>
# END: I
(her trykker jeg CRTL-d (End-of-file))
# END DOCUMENT

Ellers kan jeg først få parseren til at arbejde når den har hele XML
dokumentet.

Hvorfor sker dette? Gud hvor jeg ikke håber at det bare er sådan
Nu ikke noget med at den kun flusher til sidst, for det gør den efter
hvert linie skift, jo. Ellers havde den jo heller ikke fået "<?xml..?>"
og det har den, for den skriver jo "START DOCUMENT" ud efter første
linie skift.

Hjææælp
- Morten Green Hermansen, Fanitas


 
 
Lars Hansen (27-07-2001)
Kommentar
Fra : Lars Hansen


Dato : 27-07-01 06:47

Det kan meget vel være, at end document først skal kaldes, når den får en
EOF,
er dog ikke sikker, siden jeg ikke lige har læst specifikationerne igennem
:)

Men du får jo at vide, når du får end på dit root tag, så det eneste der kan
være
tilbage i dokumentet er kommentarer.

Du kan evt. prøve at lave samme trick, bare bruge xerces istedetfor, for at
se
hvordan den klarer din problemstilling

/Lars Hansen
"Morten Green Hermansen" <mortengh@fanitas.com> wrote in message
news:3B6039B6.2040700@fanitas.com...
> Jeg prøver lige igen. Mit tidligere spørgsmål stank
>
> Tag lige en kikker på følgende kode (kun til jdk1.4):
>
> ----------------------------------------------
> import java.io.*;
> import org.xml.sax.*;
> import org.xml.sax.helpers.*;
> import javax.xml.parsers.*;
>
> public class Echo extends DefaultHandler
> {
> public static void main(String argv[])
> {
> SAXParserFactory factory = SAXParserFactory.newInstance();
>
> try
> {
> SAXParser saxParser = factory.newSAXParser();
> saxParser.parse(System.in, new Echo());
> }
> catch(Throwable t)
> {
> t.printStackTrace();
> }
> }
>
> public void startDocument() throws SAXException
> {
> System.out.println("START DOCUMENT");
> }
>
> public void endDocument() throws SAXException
> {
> System.out.println("END DOCUMENT");
> }
>
> public void startElement(String namespaceURI, String lName,
> String qName,
> Attributes attrs) throws SAXException
> {
> System.out.println("START: " + qName);
> }
>
> public void endElement(String namespaceURI, String sName,
> String qName)
> throws SAXException
> {
> System.out.println("END: " + qName);
> }
> }
> -----------------------------------------------
>
> Hvis jeg nu kører:
> echo "<?xml version='1.0' encoding='us-ascii'?><I><O></O></I>" | java Echo
>
> Får jeg:
> (* er det jeg skriver, # er det computeren skriver)
>
> # START DOCUMENT
> # START: I
> # START: O
> # END: O
> # END: I
> # END DOCUMENT
>
> Som forvented.
>
> Kører jeg (og indtaster selv): java Echo
> (* er det jeg skriver, # er det computeren skriver)
>
> * <?xml version='1.0' encoding='us-ascii'?>
> # START DOCUMENT
> * <I>
> * <O>
> * </O>
> * </I>
> (her trykker jeg CRTL-d (End-of-file))
> # START: I
> # START: O
> # END: O
> # END: I
> # END DOCUMENT
>
> Se! Det beviser at parseren kun kører efter at den har fået end of file.
> Det jeg vil have er at den skal parse videre så snart den har noget
> mere. Det er jo det der gør en seriel parser forskellig fra en DOM parser.
> Det skal se sådan ud:
>
> * <?xml version='1.0' encoding='us-ascii'?>
> # START DOCUMENT
> * <I>
> # START: I
> * <O>
> # START: O
> * </O>
> # END: O
> * </I>
> # END: I
> (her trykker jeg CRTL-d (End-of-file))
> # END DOCUMENT
>
> Ellers kan jeg først få parseren til at arbejde når den har hele XML
> dokumentet.
>
> Hvorfor sker dette? Gud hvor jeg ikke håber at det bare er sådan
> Nu ikke noget med at den kun flusher til sidst, for det gør den efter
> hvert linie skift, jo. Ellers havde den jo heller ikke fået "<?xml..?>"
> og det har den, for den skriver jo "START DOCUMENT" ud efter første
> linie skift.
>
> Hjææælp
> - Morten Green Hermansen, Fanitas
>



Morten Green Hermans~ (27-07-2001)
Kommentar
Fra : Morten Green Hermans~


Dato : 27-07-01 10:14

> Hvorfor sker dette? Gud hvor jeg ikke håber at det bare er sådan
> Nu ikke noget med at den kun flusher til sidst, for det gør den efter
> hvert linie skift, jo. Ellers havde den jo heller ikke fået "<?xml..?>"
> og det har den, for den skriver jo "START DOCUMENT" ud efter første
> linie skift.


Jeg svarer lige mig selv.
Jeg har brugt en del tid til at analysere Sun source kode og fundet ud
af at Crimson parseren, som JDK 1.4 benytter insisterer på at læse 8K
data (eller til EOF) når den prøver at analysere XML declarationen. Den
suspendere derfor endtil den har de 8K data.
Jeg har bugreportet det til Sun og de har medtaget det som en bug.
Hvis nogle skulle være interesseret kan man følge rettelsen på:

http://developer.java.sun.com/developer/bugParade/index.jshtml

Den har bugid: 4484901

Så det er jo altsammen meget spændende.


Thorbjoern Ravn Ande~ (30-07-2001)
Kommentar
Fra : Thorbjoern Ravn Ande~


Dato : 30-07-01 00:28

Morten Green Hermansen wrote:

> Jeg har brugt en del tid til at analysere Sun source kode og fundet ud
> af at Crimson parseren, som JDK 1.4 benytter insisterer på at læse 8K
> data (eller til EOF) når den prøver at analysere XML declarationen. Den
> suspendere derfor endtil den har de 8K data.

Jeg har endnu ikke kigget paa JDK 1.4, men hvis Sun har lavet deres
hjemmearbejde bare nogenlunde, skulle du kunne ploppe en anden
SAX-parser ind i systemet meget simpelt (tilfoej en jarfil, og kig noeje
paa din SAXParserFactory).

Der findes MANGE Javaparsere. Forsoeg dig frem
--
Thorbjørn Ravn Andersen "...plus... Tubular Bells!"
http://bigfoot.com/~thunderbear

Søg
Reklame
Statistik
Spørgsmål : 177501
Tips : 31968
Nyheder : 719565
Indlæg : 6408527
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste