Avatar billede trp79 Nybegynder
12. marts 2003 - 12:25 Der er 19 kommentarer og
2 løsninger

æ,ø,å i XML

Nu hvor man skal tage hensyn til "<",">","&" i xml, hvordan tager man så hensyn til danske bogstaver? Det går fx ikke så godt når man bruger "ø". Hvor kan man i øvrigt finde en sådan oversigt over hvordan man tager hensyn til de forskellige ting? Omkring danske bogstaver, så skal man vel selv konverterer tilbage igen ved indlæsning? Det skal man jo ikke med "<",">","&", men det er jo nok også lidt mere internationalt!
Avatar billede viht Nybegynder
12. marts 2003 - 12:32 #1
Hvad har du stående i din xml prolog?

Selv med standard unicode: <?xml version="1.0" encoding="UTF-8"?>
kan du gemme og hente æ,ø og å.
Avatar billede Slettet bruger
12. marts 2003 - 13:01 #2
prøv at sætte følgende header ind:
<?xml version="1.0" encoding="ISO-8859-1"?>
Avatar billede magoo20000 Nybegynder
12. marts 2003 - 20:07 #3
Du skal indsætte
<!DOCTYPE etellerandet
[
  <!ENTITY oslash "&#248;">
  ...
]>

ind øverst i dit XML dokument.

Derefter benytter du &oslash; for ø osv.

Med etellerandet mener jeg navnet på det yderste element du har.
Avatar billede trp79 Nybegynder
12. marts 2003 - 21:29 #4
Vil det sige at jeg uden videre kan skifte "<?xml version='1.0' standalone='yes'?>" ud med en af overstående? I den jeg benytter nu altså "<?xml version='1.0' standalone='yes'?>" Konverter jeg <,>,&
Skal jeg så stadigvæk blive ved med det?

Hvad er iøvrigt forskellen på vith's og its?
Avatar billede trp79 Nybegynder
12. marts 2003 - 21:52 #5
Jeg prøvede med vihts version... det var den godt nok ikke så glad for :o(
Dvs. det gik fint med at alt andet end æ,ø,å

Her kan i se min kode (med viths forslag):
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;

import javax.xml.parsers.FactoryConfigurationError;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;

import java.util.*;
import java.text.*;//Til dato/tid


public class OmsXml {

    public static void writeOmsXml(List data, String filename) {
        try {
            PrintWriter pw = new PrintWriter(new FileOutputStream(filename));
            pw.println("<?xml version='1.0' encoding='UTF-8'?>");
            pw.println("<arraylist>");
            Omsaetning current = null;
            for (int i = 0; i < data.size(); i++) {
                current=(Omsaetning) data.get(i);
                pw.println("  <element>");
                    pw.println(" <aar>" + xmlConvert(current.getAar()) + "</aar>");
                    pw.println(" <firma>" + xmlConvert(current.getFirma()) + "</firma>");
                    pw.println(" <oms>" + xmlConvert(current.getOms()) + "</oms>");
                    pw.println(" <oprettet>" + xmlConvert(current.getOprettet()) + "</oprettet>");
                    pw.println( "</element>");
            }
            pw.println("</arraylist>");
            pw.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
    public static ArrayList readOmsXml(ArrayList firmaListe,String filename) {
        ArrayList result = new ArrayList();
        try {
            SAXParserFactory spf = SAXParserFactory.newInstance();
            SAXParser sp = spf.newSAXParser();
            XMLReader xr = sp.getXMLReader();
            xr.setContentHandler(new MySaxParserOms(result, firmaListe));
            xr.parse(filename);
        } catch (FactoryConfigurationError e) {
            e.printStackTrace();
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;
    }

  public static String xmlConvert(String tmp)
  {
      String s = tmp.replaceAll("&", "&amp;");
      tmp = s.replaceAll("<", "&lt;");
      s = tmp.replaceAll(">", "&gt;");
        return s;
  }
}

class MySaxParserOms extends DefaultHandler {
    private StringBuffer element = new StringBuffer();
    private Firma firma = new Firma();
    private Omsaetning omsObj;
    private ArrayList result;
    private ArrayList firmaListe;
    Metoder m = new Metoder();
    public MySaxParserOms(ArrayList result, ArrayList firmaListe) {
        this.result = result;
        this.firmaListe = firmaListe;
    }
    public void characters(char buf[], int offset, int len)
        throws SAXException {
        element.append(new String(buf, offset, len));
        return;
    }

    public void startElement(
        String namespaceURI,
        String localName,
        String rawName,
        Attributes atts)
        throws SAXException {
        if (rawName.equals("element")) {
            omsObj = new Omsaetning();
        }
        if (rawName.equals("aar")) {
            element = new StringBuffer();
        }
        if (rawName.equals("firma")) {
            element = new StringBuffer();//skal være der for at aflæse hvad firmanavnet er i KPerson.xml
            firma = new Firma();
        }
        if (rawName.equals("oms")) {
            element = new StringBuffer();
        }
        if (rawName.equals("oprettet")) {
            element = new StringBuffer();
        }
        return;
    }

    public void endElement(
        String namespaceURI,
        String localName,
        String rawName)
        throws SAXException {
        if (rawName.equals("element")) {
            result.add(omsObj);
        }
        if (rawName.equals("aar")) {
            omsObj.setAar(element.toString());
        }
        if (rawName.equals("firma")) {
              omsObj.setFirma(m.findFirma(firmaListe,element.toString()));
        }
        if (rawName.equals("oms")) {
            omsObj.setOms(element.toString());
        }
        if (rawName.equals("oprettet")) {
            omsObj.setOprettet(element.toString());
        }
        return;
    }
}
Avatar billede arne_v Ekspert
12. marts 2003 - 22:28 #6
ÆØÅ kan encodes på flere måder.

To af de mest udbredte er ISO-8859-1 og UTF-8.

Hvis du bruger UTF-8 så kan du bruge:
<?xml version="1.0" encoding="UTF-8"?>
eller:
<?xml version="1.0"?>
fordi UTF-8 er default.

Hvis du bruger ISO-8859-1 så kan du bruge:
<?xml version="1.0" encoding="ISO-8859-1"?>

En af dem bør virke.

Det er principielt også muligt at definere entities, men det burde
ikke være nødvendigt.

Nu siger du at ÆØÅ "ikke virker". Præcis hvordan virker de ikke ?
Avatar billede viht Nybegynder
12. marts 2003 - 22:57 #7
Det skal lige siges at jeg bruger DOM til at parse i netop det eksemepel jeg relaterer til. Jeg ved ikke om det gør nogen forskel.

XML'en når den er udprintet ser sådan her ud:
font_info font_size="12" text="æøå" read_only="false" y="99" font_style="0" x="140" font_name="Helvetica"/>
Hvor det er attributten text der er vigtig. Det er umiddelbart ulæsbart, men når det læses ind igen bliver det lavet om til æ,ø og å.
Avatar billede trp79 Nybegynder
13. marts 2003 - 01:05 #8
Hvis jeg bruger den kode som jeg har postet ser min xml fil således ud hvis jeg ikke bruger æ,ø,å,Æ,Ø,Å:
<?xml version="1.0" encoding="UTF-8" ?>
- <arraylist>
- <element>
  <aar>1990</aar>
  <firma>Firma a</firma>
  <oms>200.000</oms>
  <oprettet>13-mar-2003 00:49</oprettet>
  </element>
  </arraylist>
Men hvis jeg så tilføjer en omsætning hvor året er "ø" ser den således ud i internet explore:
"XML-siden kan ikke vises
XML-kan ikke vises ved hjælp af typografiarket XSL. Ret fejlen, og klik derefter på knappen Opdater, eller prøv igen senere.


--------------------------------------------------------------------------------

Der blev fundet et ugyldigt tegn i tekstindholdet. Der opstod en fejl under behandling af ressourcen 'file:///C:/Documents and Settings/Torben Pedersen/Dokumenter/DØK/2.År/Datalogi/Java/Rasmus/test/Oms.xml'. Linje 10, position 7

<aar>

"
Hvorimod hvis man åbner den med notepad så ser det helt rigtigt ud:
<?xml version='1.0' encoding='UTF-8'?>
<arraylist>
  <element>
<aar>1990</aar>
<firma>Firma a</firma>
<oms>200.000</oms>
<oprettet>13-mar-2003 00:49</oprettet>
</element>
  <element>
<aar>Ø</aar>
<firma>Firma a</firma>
<oms>200.000</oms>
<oprettet>13-mar-2003 00:52</oprettet>
</element>
</arraylist>

Tingene står altså rigtigt i filen. Men når jeg prøver at læse den ind igen ved hjælp af "public static ArrayList readOmsXml" så får jeg denne fejl:
http://www.confunded.dk/tp/xmlfejl.JPG

Hvad pokker kan det være?
Avatar billede trp79 Nybegynder
13. marts 2003 - 01:08 #9
kender min comp ikke encoderen siden hverken min (jeg fik den af arne) readOmsXml metode eller internet explore vil læse filen?
Avatar billede arne_v Ekspert
13. marts 2003 - 01:10 #10
Hvordan virker:

<?xml version="1.0" encoding="ISO-8859-1" ?>
- <arraylist>
- <element>
  <aar>øøøøøø</aar>
  <firma>Firma a</firma>
  <oms>200.000</oms>
  <oprettet>13-mar-2003 00:49</oprettet>
  </element>
  </arraylist>

Med programmet ? (og med Internet Explorer ?)
Avatar billede arne_v Ekspert
13. marts 2003 - 01:11 #11
Programmet siger jo meget klart, at din fil indeholder
noget der ikke er validt UTF-8.

Og et ISO-8859-1 Ø er ikke validt i UTF-8 *og* Notepad
kan mig bekendt sagtens vise ISO-8859-1, så det er værd
at prøve med ISO-8859-1 !
Avatar billede trp79 Nybegynder
13. marts 2003 - 01:11 #12
Jeg har nu prøvet med frem og <?xml version="1.0" encoding="ISO-8859-1"?> virker godt :o) Men burde den anden ikke også virke?
Tak for hjælpen :D
Avatar billede trp79 Nybegynder
13. marts 2003 - 01:12 #13
Ok, så er jeg med, tak for forklaringen Arne :o)
Mvh
Torben
Avatar billede arne_v Ekspert
13. marts 2003 - 01:13 #14
Hvis du laver "save as"/"gem som" i Notepad på Windows 2000/XP kan du iøvrigt
vælge mellem ANSI (som må være tæt på ISO-8859-1) og UTF-8 !
Avatar billede arne_v Ekspert
13. marts 2003 - 01:15 #15
Der er mange som har problemer med den encoding fordi ISO-8859-1
har været en meget udbredt standard i mange år.

Og XML valgte så at satse på den nyere UTF-8 standard.
Avatar billede trp79 Nybegynder
13. marts 2003 - 01:15 #16
--> mangoo20000, jeg forstår ikke lige dit bud :o(
Avatar billede trp79 Nybegynder
13. marts 2003 - 01:16 #17
Derfor fik du 0 points.
Avatar billede arne_v Ekspert
13. marts 2003 - 01:19 #18
Hvis du sætter en:

<!DOCTYPE etellerandet
[
  <!ENTITY oslash "&#248;">
  ...
]>

ind øverst i dokumentet (eller i en DTD som du refererer til)
og laver en replaceAll("ø", "&oslash;") på alt det du skriver,
så burde det faktisk også virke.

Men det er lidt besværligt. Og filerne ser mærkelige ud i Notepad.

Så jeg vil ikke anbefale den løsning.

Til *dette* brug.

Hvis vi er over og snakke XHTML, så kan der godt argumenteres
for at det er smart at bruge &oslash; af hensyn til diverse
håbløse browsere.

(XHTML er HTML som XML)
Avatar billede arne_v Ekspert
13. marts 2003 - 01:23 #19
Avatar billede trp79 Nybegynder
13. marts 2003 - 08:23 #20
Så er det jo ret smart.... hvis man fx har en xml fil med en masse data, så ændre man bare i headeren i filerne (og så selvfølgelig i sin write metode) hvis man har problemer. Det er da til at finde ud af :o)
Avatar billede arne_v Ekspert
13. marts 2003 - 13:47 #21
Jeg synes nu nærmest at det er tragisk at vi i 2003 stadigvæk
har problemer med ÆØÅ.
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