Avatar billede simonvalter Praktikant
27. maj 2004 - 10:20 Der er 13 kommentarer og
1 løsning

et par xml spørgsmål

er det muligt at validere imod et schema med sax

jeg kan godt bruge et dtd
der gør jeg dette

SAXParserFactory spf = SAXParserFactory.newInstance();
spf.setValidating(true);

med
<!DOCTYPE handel SYSTEM "handel.dtd">
virker det
med
<handel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="handel.xsd">
gør det ikke:
27-05-2004 10:15:13 dk.gbit.aktiehandel.HandelsParser$MyErrorHandler warning
WARNING: Valid documents must have a <!DOCTYPE declaration.

mit problem er at jeg skal lave en validering af dokumentet, jeg vil meget gerne bruge sax fordi at jeg kun skal parse en handel og oprette den til at starte med.


senere skal jeg så lave en transformation som er svaret på handlen som skal laves til xml men der har jeg et problem med at få vist æøå.

jeg laver et dom document som jeg sender til min tranformator
og som jeg har forstået det skal jeg bare sætte encoding for at få det til at virke, men det vil ikke som jeg vil

gør dette:

      Transformer transformer = factory.newTransformer(new StreamSource(
                "handel.xsl"));
            transformer.setOutputProperty(javax.xml.transform.OutputKeys.ENCODING,"ISO-8859-1");

            try
            {
                xmlout = new StringWriter();
                StreamResult result = new StreamResult(xmlout);
                transformer.transform(new DOMSource(doc), result);
            }...
Avatar billede arne_v Ekspert
27. maj 2004 - 10:23 #1
Ja.

Eksempel:

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

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

import org.xml.sax.SAXException;
import org.xml.sax.SAXNotRecognizedException;
import org.xml.sax.SAXNotSupportedException;
import org.xml.sax.SAXParseException;
import org.xml.sax.helpers.DefaultHandler;

public class ValWithSaxAndSchema {
  static final String JAXP_SCHEMA_LANGUAGE =
      "http://java.sun.com/xml/jaxp/properties/schemaLanguage";
  static final String W3C_XML_SCHEMA =
        "http://www.w3.org/2001/XMLSchema";
  static final String JAXP_SCHEMA_SOURCE =
      "http://java.sun.com/xml/jaxp/properties/schemaSource";
  public static void main(String[] args) {
      try {
        SAXParserFactory factory = SAXParserFactory.newInstance();
        factory.setNamespaceAware(true);
        factory.setValidating(true);
        SAXParser saxParser = factory.newSAXParser();
        saxParser.setProperty(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA);
        saxParser.setProperty(JAXP_SCHEMA_SOURCE, new File(args[1]));
        saxParser.parse(new File(args[0]), new ValHandler());
      } catch (SAXNotRecognizedException e) {
        e.printStackTrace();
      } catch (SAXNotSupportedException e) {
        e.printStackTrace();
      } catch (FactoryConfigurationError e) {
        e.printStackTrace();
      } catch (ParserConfigurationException e) {
        e.printStackTrace();
      } catch (SAXException e) {
        e.printStackTrace();
      } catch (IOException e) {
        e.printStackTrace();
      }
  }
}

class ValHandler extends DefaultHandler {
    public void error(SAXParseException e) {
        e.printStackTrace();
    }
    public void warning(SAXParseException e) {
        e.printStackTrace();
    }
}
Avatar billede arne_v Ekspert
27. maj 2004 - 10:24 #2
Du skal have en *meget* ny XML parser.

Der skal nok rettes lidt til for dit formål, men det formoder jeg ikke er
noget problem.
Avatar billede simonvalter Praktikant
27. maj 2004 - 10:27 #3
ja det tænkte jeg nok, vi har desværre fået nogen latterlige regler om at læren/sensor skal kunne afvikle programmet direkte i jbuilder6 på skolens maskiner uden at ændre noget
men jeg tror jeg tager chancen og laver en jar og en bat fil og skriver med stort .. tryk på mig ;)
Avatar billede arne_v Ekspert
27. maj 2004 - 10:35 #4
JB6 - hmmmm
Avatar billede simonvalter Praktikant
27. maj 2004 - 10:39 #5
ja det var først på 3 semester vi fik lov til at bruge jb6, før det var det jb4 på gamle pentium maskiner .. og så undrer de sig over at man aldrig er i skole :)
Avatar billede simonvalter Praktikant
27. maj 2004 - 11:22 #6
det skulle vist være muligt i xerces2 ved at gøre dette, men jeg kan ikke få det til at virke så jeg tror jeg holder mig til DTD da det klarer opgaven fint.

static final String VALIDATE =
        "http://xml.org/sax/features/validation";
    static final String SCHEMA =
        "http://apache.org/xml/features/validation/schema";


    xr.setFeature(VALIDATE,true);
            xr.setFeature(SCHEMA,true);

men ved du hvad jeg kan prøve med mit encoding problem?
Avatar billede simonvalter Praktikant
27. maj 2004 - 11:22 #7
hvor xr er XMLReader xr = sp.getXMLReader();
Avatar billede arne_v Ekspert
27. maj 2004 - 11:40 #8
Den kode jeg postede er testet med Xerces.

Hvilken fejl får du med encoding.
Avatar billede simonvalter Praktikant
27. maj 2004 - 11:46 #9
med din kode fik jeg fejl om at den ikke kendte en af de properties der er.

når jeg transformerer får jeg ikke fejl men æøå biver vist som &aring; når jeg laver system.out i jb
Avatar billede simonvalter Praktikant
27. maj 2004 - 11:53 #10
her er den relevante del af koden hvis det hjælper


  public Document Build(Handel h)
    {
        try
        {
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
            doc = db.newDocument();

            Element handel = doc.createElement("handel");

          ....
          ....
          ....
         

        }
        catch (FactoryConfigurationError e)
        {
            e.printStackTrace();
        }
        catch (ParserConfigurationException e)
        {
            e.printStackTrace();
        }
        return doc;
    }

    /**
    * Transformerer et Document til html
    * @param doc Document
    * @return String
    */
    public String Transform(Document doc)
    {
        StringWriter xmlout = null;
        TransformerFactory factory = TransformerFactory.newInstance();
        try
        {
            Transformer transformer = factory.newTransformer(new StreamSource(
                "handel.xsl"));
            transformer.setOutputProperty(javax.xml.transform.OutputKeys.ENCODING,"ISO-8859-1");

            try
            {
                xmlout = new StringWriter();
                StreamResult result = new StreamResult(xmlout);
                transformer.transform(new DOMSource(doc), result);
            }
            catch (TransformerException ex)
            {
                ex.printStackTrace();
            }
        }
        catch (TransformerConfigurationException ex1)
        {
            ex1.printStackTrace();
        }
        return xmlout.getBuffer().toString();
    }

}
Avatar billede arne_v Ekspert
28. maj 2004 - 00:00 #11
Jeg får det samme med en flunkende ny Xerces.

ingenting eller transformer.setOutputProperty(javax.xml.transform.OutputKeys.METHOD, "html");

giver de entities

transformer.setOutputProperty(javax.xml.transform.OutputKeys.METHOD, "xml");

giver de rå ÆØÅ
Avatar billede arne_v Ekspert
28. maj 2004 - 00:01 #12
Jeg tror at "xml" og så XMLSerializer ville være godt
Avatar billede simonvalter Praktikant
28. maj 2004 - 10:15 #13
smid et svar jeg vender tilbage imorgen.
Avatar billede arne_v Ekspert
28. maj 2004 - 11:05 #14
svar
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