Avatar billede olly Nybegynder
22. februar 2002 - 21:00 Der er 26 kommentarer og
1 løsning

XML

Nogen der kan give mig et eks på hvordan jeg bruger xml i et Javaprogram? For det kunne jeg godt bruge til at projekt på DM uddannelsen... Så skal vi sige 150 point.
Avatar billede carstenknudsen Nybegynder
22. februar 2002 - 23:05 #1
I morgen kan du få et par forslag.
Avatar billede olly Nybegynder
24. februar 2002 - 14:47 #2
Vil jeg MEGET gerne have....
Avatar billede df_n Nybegynder
25. februar 2002 - 00:02 #3
jeg bruger JDOM:

her er xml filen:

<root>
  <child childAtt="HALLO">
  </child>
</root>

*************

her er noget java kode:

public void reader() {
  Document doc = null;
  try {
      File xmlFile = new File("filepath");
      SAXBuilder builder = new SAXBuilder();
      doc = builder.build(xmlFile);
      Element root = null;
      Element child = null;
      root = doc.getRootElement();
      child = root.getChild("child");
      System.out.println(child.getAttributeValue("childAtt");
  } catch(Exception e) {
      System.out.println();
  }

Kig på: http://www.jdom.org/docs/apidocs/index.html
Avatar billede carstenknudsen Nybegynder
25. februar 2002 - 09:55 #4
Hvilket omfang er dit projekt på og hvad kender
du til XML i forvejen?
Avatar billede olly Nybegynder
25. februar 2002 - 15:28 #5
Carsten << Kender kun lidt til det... Kan lave velformed XML det er alt...

Det er bare et alm Datamatiker projekt... Vil bruge XML til settings...
Avatar billede olly Nybegynder
25. februar 2002 - 15:30 #6
df_n << Jeg vil gerne kunne holde mig til den support der er i JDK 1.4 og hvad skal jeg importe?
Avatar billede carstenknudsen Nybegynder
25. februar 2002 - 15:32 #7
Undskyld at jeg ikke har sendt noget, jeg skal gerne send
lidt simpel kode der viser den primære anvendelse
af xml i Java, men det bliver først hjemmefra i aften.
Avatar billede olly Nybegynder
25. februar 2002 - 15:50 #8
Carsten << Jamen det vil jeg da MEGET gerne! Jeg siger tak!
Avatar billede carstenknudsen Nybegynder
25. februar 2002 - 20:30 #9
En af de mest nærliggende anvendelser er
xml er til beskrivelse af objekter i
form af data strukturer eller lign. I Java
er det således oplagt at lade et objekt
være i stand til at udtrykke sig selv
i xml, f.eks. ved at have et interface:
public interface XMLExpressible {
public String toXML();
}
hvor metoden toXML skal give en tekstuel
beskrivelse i xml af objektet. Dette gør
det muligt for programmer i andre sprog
C/C++/C# etc at læse og fortolke dette.
Det modsatte er også vigtigt, nemlig
givet en xml kode der beskriver et objekt
dan objektet. Sidstnævnte er det vanskeligste,
men det kan lade sig gøre relativt smertefrit.
Jeg vil give en beskrivelse der benytter
en SAX parser fremfor DOM parseren som
nævnt tidligere. Førstnævnte har den fordel
at den er relativt let at skrive og bruge,
samt er hurtig og bruger lidt hukommelse.
Lad os definere en klasse der implementerer
XMLExpressible:
public class PhoneNumber implements XMLExpressible {
private int countryCode;
private int localNumber;
public PhoneNumber(int cC, int lN) {
countryCode = cC;
localNumber = lN;
}
public String toXML() {
return "<?xml version=\"1.0\"?>" +
"<code>" + countryCode + "</code>" +
"<number>" + localNumber + "</number>";
}
}
Næste indlæg går til det andet problem.
Avatar billede olly Nybegynder
25. februar 2002 - 21:03 #10
Jeg kan ikke få det til at virke.... Jeg skal importe et eller andet vel?

HVAD?
Avatar billede carstenknudsen Nybegynder
25. februar 2002 - 21:25 #11
Her er et par filer du skal have:
læg i en file phoneNumber:
<?xml version="1.0"?>
<phonenumber>       
<code>45</code>
<number>12345678</number>
</phonenumber>
Avatar billede carstenknudsen Nybegynder
25. februar 2002 - 21:26 #12
læg i en fil PhoneNumber.java:
public class PhoneNumber implements XMLExpressible {
    private int countryCode;
    private int localNumber;
    public PhoneNumber(int cC, int lN) {
    countryCode = cC;
    localNumber = lN;
    }
    public String toXML() {
    return "<?xml version=\"1.0\"?>" + "<phonenumber>" +
        "<code>" + countryCode + "</code>" +
        "<number>" + localNumber + "</number>" + "<phonenumber>";
    }
    public String toString() {
    return "<" + countryCode + "," + localNumber + ">";
    }
}
Avatar billede carstenknudsen Nybegynder
25. februar 2002 - 21:26 #13
læg i en fil XMLExpressible.java

public interface XMLExpressible {
    public String toXML();
}
Avatar billede carstenknudsen Nybegynder
25. februar 2002 - 21:27 #14
læg i en fil PhoneNumberHandler.java:
import javax.xml.parsers.*;
import org.xml.sax.*;
import org.xml.sax.helpers.*;
import java.io.*;
import java.util.*;

public class PhoneNumberHandler extends DefaultHandler {

    private XMLReader xmlreader = null;
    private CharArrayWriter contents = new CharArrayWriter();
    private int code = -1;
    private int number = -1;
    private PhoneNumber phoneNumber = null;

    public PhoneNumberHandler( XMLReader xmlreader ) {
    this.xmlreader = xmlreader;
    } // constructor
   
    public PhoneNumber getPhoneNumber() {
    return phoneNumber;
    } // getStack

    public void characters( char[] ch,
                int start,
                int length ) {
    contents.write( ch, start, length );
    } // characters

    public void startElement( String nameSpaceURI,
                  String localName,
                  String qName,
                  Attributes attr ) throws SAXException {
    contents.reset();
    } // startElement
   
    public void endElement( String nameSpaceURI,
                String localName,
                String qName ) throws SAXException {
    try {
        if ( qName.equalsIgnoreCase( "phonenumber" ) ) {
        phoneNumber = new PhoneNumber( code, number );
        } // if
        else if ( qName.equalsIgnoreCase( "code" ) ) {
        code = Integer.parseInt( contents.toString().trim() );
        } // else if
        else if ( qName.equalsIgnoreCase( "number" ) ) {
        number = Integer.parseInt( contents.toString().trim() );
        } // else if
        else {
        throw new Exception( "Unknown tag: " + qName );
        } // else
    } // try
    catch ( Exception e ) {
        throw new SAXException( e.getMessage() );
    } // catch
    } // endElement
   
    public static void main( String[] args ) throws Exception {
    XMLReader xr = SAXParserFactory.newInstance().newSAXParser().getXMLReader();
    PhoneNumberHandler handler = new PhoneNumberHandler( xr );
    xr.setContentHandler( handler );
    xr.parse( new InputSource( new FileInputStream( "phoneNumber" )  ) );
    PhoneNumber phoneNumber = handler.getPhoneNumber();
    System.out.println("phoneNumber="+phoneNumber);
    } // main

}
Avatar billede olly Nybegynder
25. februar 2002 - 21:27 #15
Undskyld... Jeg er dum... Det er jo selvfølgelig bare et interface.....
Avatar billede carstenknudsen Nybegynder
25. februar 2002 - 21:29 #16
Kompiler filerne med
javac PhoneNumber.java XMLExpressible.java PhoneNumberHandler.java
Kør eksempelprogrammet (main metoden) fra
PhoneNumberHandler med
java -cp . PhoneNumberHandler
så skulle du gerne få et PhoneNumber
skrevet ud på skærmen. Meld tilbage når
du har fået det til at køre.
PS Husk at du skal bruge J2SDK version 1.4
Avatar billede carstenknudsen Nybegynder
25. februar 2002 - 21:30 #17
Så snart du har fået det til at
køre giver jeg yderligere kommentarer.
Det eneste problem skulle være
PhoneNumberHandler der er lidt uvant.
Avatar billede olly Nybegynder
25. februar 2002 - 21:35 #18
Du har allerede nu fortjent points... Med den store hjælp til en dum Datamatiker som mig :) Jeg får denne fejl....

Exception in thread "main" org.xml.sax.SAXParseException: XML declaration may only begin entities.
        at org.apache.crimson.parser.Parser2.fatal(Parser2.java:3182)
        at org.apache.crimson.parser.Parser2.fatal(Parser2.java:3170)
        at org.apache.crimson.parser.Parser2.maybePI(Parser2.java:966)
        at org.apache.crimson.parser.Parser2.maybeMisc(Parser2.java:1092)
        at org.apache.crimson.parser.Parser2.parseInternal(Parser2.java:487)
        at org.apache.crimson.parser.Parser2.parse(Parser2.java:305)
        at org.apache.crimson.parser.XMLReaderImpl.parse(XMLReaderImpl.java:442)
        at PhoneNumberHandler.main(PhoneNumberHandler.java:62)
Avatar billede olly Nybegynder
25. februar 2002 - 21:46 #19
Jeg har løst den... Det var bare ændre til at xmlfilen havde ekstention .xml.... Altså....

xr.parse( new InputSource( new FileInputStream( "phoneNumber.xml" )  ) );

Og så omdøbe filen til den ekstention
Avatar billede olly Nybegynder
25. februar 2002 - 21:47 #20
Jeg giver dig de 150 point nu... Men hvis du vil hjælpe mere vil jeg meget gerne det! Men jeg er meget taknemlig allerede....
Avatar billede carstenknudsen Nybegynder
25. februar 2002 - 21:58 #21
Tak, men jeg vil gerne hjælpe dig lidt videre.
I morgen formiddag får du en mere udførlig
beskrivelse af PhoneNumberHandler, der er
den centrale klasse. Hvis du har spørgsmål
til de andre filer/klasser besvarer jeg
gerne dem først.
Avatar billede olly Nybegynder
25. februar 2002 - 22:05 #22
Ikke lige... Har desværre ikke tid til at fordybe mig i dem i aften, men først i morgen!

Jeg er meget glad for denne hjælp... Det var bare dejligt...

Og jeg trode jeg var en habil programmør :)
Avatar billede olly Nybegynder
25. februar 2002 - 22:10 #23
Har faktisk et... Jeg har lavet sådan at jeg kan skribe til en fil og så er det jeg gerne vil have det linieskift efter hver linie...
Sådan her:

<?xml version="1.0"?>
<phonenumber>
<code>45</code>
<number>26713360</number>
</phonenumber>

i stedet for sådan her...

<?xml version="1.0"?> <phonenumber> <code>45</code> <number>26713360</number> </phonenumber>
Avatar billede olly Nybegynder
25. februar 2002 - 22:19 #24
Underligt... Det er selvfølgeligt bare sætte \n efter, men det synes notepad ikke! Men okay... Kan leves med...
Avatar billede carstenknudsen Nybegynder
26. februar 2002 - 09:20 #25
Du skal ikke bruge \n, brug altid:
String CR = System.getProperty("line.separator");
og smid CR ind hvor du vil have linieskift, så
kører det på alle platforme.
Avatar billede carstenknudsen Nybegynder
26. februar 2002 - 10:38 #26
Som tidligere nævnt er det oversættelsen fra xml til
Java objekt der er det svære. Heldigvis foregår selve
læsningen af xml kildeteksten automatisk, herunder
checkes om syntaksen er iorden. Den ansvarlige
for læsninger er en XMLReader:
XMLReader xr = SAXParserFactory.newInstance().newSAXParser().getXMLReader();
Denne reader læser den xml kilde som den får her:
xr.parse( new InputSource( new FileInputStream( "phoneNumber" )  ) );
parse metoden læser så kildeteksten igennem og
splitter den op i start tags "<code>", content "45" og
end tags "</code>" og lignenden for resten af dokumentet.
XMLReader'en ved ikke hvad den skal gøre med disse
hvorfor man skal registrere en handler der så får
besked af XMLReaderen når den har læst en af
de tre typer. Handleren instantieres med
PhoneNumberHandler handler = new PhoneNumberHandler( xr );
og registrere hos XMLReader'en med
xr.setContentHandler( handler );
Dette gøres selvsagt før parse metoden kaldes.
Når XMLReaderen har læst en start tag kalder den
handlerens startElement metode (det kaldes callback),
når den har læst en end tag kalder den endElement
og for content kalder den characters. De tre metoder
skal så defineres i ens handler som i tilfældet med
PhoneNumberHandler. Det er ofte tilfældet at startElement
ikke skal gøre noget overhovedet (for simple tilfælde).
characters skal ikke gøre andet end at smide content
i en buffer der så læses når end tag er læst og
endElement kaldes. I tilfældet med <code> forventer
vi at der ligger et tal der beskriver landekode og
vi parser derfor med linien:
code = Integer.parseInt( contents.toString().trim() );
Vi kalder trim metoden fordi mellemrum kan give
problemer med parsing til tal. Det samme sker for
telefonnummeret.  I begge tilfælde gemmes det
læste i en int variabel så det kan bruges når
vi senere skal konstruere en instans af PhoneNumber.
Når man læser den endelige
end tag </phonenumber> ved vi at det er det
sidste der er at læse. Derfor instantierer den
et PhoneNumber og lægger det i en variabel.
Denne variable kan ekstraheres fra handleren
med metode kaldet:
PhoneNumber phoneNumber = handler.getPhoneNumber();
Til slut et par kommentarer. Handleren er simplificeret
idet den ikke checker for om der overhovedet er
læst værdier for landekode og telefonnummer, og
om de giver mening. For at holde koden kort og
overskuelig er disse fejlchecks udeladt, de vil normalt
være at finde i god kode.
Send dine yderligere spørgsmål så skal jeg sende
yderligere kommentarer.
PS Et element i xml er "<code>123</code>" hvorfor
metoderne naturligt hedder start/endElement.
Avatar billede olly Nybegynder
26. februar 2002 - 19:39 #27
Jeg siger tak foreløbigt... Jeg vil lege lidt med det og se... Vender tilbage hvis der er yderligere...
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