Avatar billede juliemusen Nybegynder
07. februar 2012 - 22:06 Der er 13 kommentarer og
1 løsning

DTD

Hejsa

Jeg sidder og læser på XML Schema og DTD. Jeg forstår noget af det, men hvis i skulle beskrive med jeres ord hvad DTD og XML Schema er, hvad gør de og hvad bruges de til.

Hvad ville i så sige?

Kh Julie
Avatar billede arne_v Ekspert
07. februar 2012 - 22:31 #1
DTD og Schema er en formel specifikation af hvad en given XML fil kan indeholde.

Og fordi det er en formel specifikation kan man faktisk validere om en given XML fil matcher DTS/Schema.
Avatar billede arne_v Ekspert
07. februar 2012 - 22:33 #2
DTD definerer kun element og attributter.

Schema giver mulighed for at angive restriktioner paa vaerdier og for at angive namespaces.
Avatar billede juliemusen Nybegynder
07. februar 2012 - 23:30 #3
"DTD og Schema er en formel specifikation af hvad en given XML fil kan indeholde"

Hvorfor skal man vide det? Jeg ved godt det er et dumt spørgsmål. Men hvad bruger man så præcis XML til. Jeg har forstået det sådan at XML bruges til at gemme og transportere data, som fx vises i et HTML dokument. Er det helt ved siden af?
Avatar billede arne_v Ekspert
08. februar 2012 - 01:34 #4
Hvis du nu skal lave et program som skal laese en XML fil som skrives af et program jeg laver, saa har vi jo brug for at vaere enige om hvad den skal indholde.

Det kan man angive via DTD eller schema.
Avatar billede arne_v Ekspert
08. februar 2012 - 01:37 #5
<data>
  <rec>
      <a>1</a>
      <b>2</b>
  </rec>
  <rec>
      <a>3</a>
      <b>4</b>
  </rec>
</data>

og

<data>
  <rec a="1" b="2"/>
  <rec a="3" b="4"/>
</data>

indeholder samme information men et program skal vide hvilket format det er for at kunne laese en fil
Avatar billede juliemusen Nybegynder
08. februar 2012 - 16:55 #6
ah ha ok på den måde. Så man laver XML Schema og DTD, for at bla. andre kan udvikle videre på ens program. Dermed mener jeg på den måde, at jeg laver en hjemmeside om opskrifter. Den er så brand god, at Microsoft køber den for et tre cifret milliard beløb :-) De kan nu gå ind i XML Schema, og se de standarder på programmet som jeg har lavet, og videreudvikle på det.

Er det sådan nogenlunde forstået?

Lige et tillægsspørgmål. XML bruges til at gemme og hente data fra, sådan som jeg har forstået det. Er det så ikke en slags database, eller formidling af database? Jeg forstår det også på den måde, at XML kan bruges til, hvis man fx laver 10 <form> i HTML, så kan man kode det således i XML, at brugeren skal udfylde alle 10 felter, ellers kan man ikke sende. Er det også nogenlunde korrekt?

Kh Julie.

Ps lig et svar :-)
Avatar billede arne_v Ekspert
08. februar 2012 - 17:05 #7
Hvis man har program koden kan man videreudvikle uden DTD/Schema.

Det er mere situationen:

program A skriver----XML file----program B laeser

hvor DTD/Schema dokumenterer formatet saaledes at det faktisk vil fungere - at A skrive rnoget som B kan laese
Avatar billede arne_v Ekspert
08. februar 2012 - 17:07 #8
XML filer kan nogen gange betragtes som en simpel database.

Men relationelle databaser kan ogsaa gemme XML i felter (de mest populaere databaser har specielle felt typer til XML).

Og der findes ogsaa specielle XML databaser som kun tager XML.
Avatar billede arne_v Ekspert
08. februar 2012 - 17:07 #9
og et svar
Avatar billede juliemusen Nybegynder
08. februar 2012 - 19:43 #10
Hej igen Arne.

Tak for hjælpen. Jeg bliver altså nød til lige at have slået det helt fast.

program A skriver----XML file----program B laeser

Dvs. Jeg bygger mit program A, og lavet et XML Schema, da jeg så ved at program B læser det?

Eller på den måde, at man har sat nogle regler op i et XML Schema, som man skal lave program af. Hvis man ikke opfylder disse ting, vil program B ikke læse det?
Avatar billede arne_v Ekspert
08. februar 2012 - 20:18 #11
ikke helt

forfatteren af program A og forfatteren af program B saetter sig ned og bliver enige om et schema

derefter implementeres program A saa det skriver XML der overholder schema og program B skrives saa det kan laese XML der overholder schema

og saa virker det
Avatar billede juliemusen Nybegynder
11. februar 2012 - 21:21 #12
ok mange tak :-)
Avatar billede arne_v Ekspert
11. februar 2012 - 22:37 #13
DTD eksempel

test.dtd


<!ELEMENT data (rec)*>
<!ELEMENT rec EMPTY>
<!ATTLIST rec a CDATA #REQUIRED>
<!ATTLIST rec b CDATA #REQUIRED>


test1.xml


<!DOCTYPE data SYSTEM "test.dtd">
<data>
  <rec>
      <a>1</a>
      <b>2</b>
  </rec>
  <rec>
      <a>3</a>
      <b>4</b>
  </rec>
</data>


test2.xml


<!DOCTYPE data SYSTEM "test.dtd">
<data>
  <rec a="1" b="2"/>
  <rec a="3" b="4"/>
</data>


test3.xml


<!DOCTYPE data SYSTEM "test.dtd">
<data>
  <rec a="1" b="2"/>
  <rec a="3" b="4.5"/>
</data>


ValidateDTD.java


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

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

import org.w3c.dom.Document;
import org.xml.sax.EntityResolver;
import org.xml.sax.ErrorHandler;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;

public class ValidateDTD {
    public static void testDTD(final String xmlfnm, final String dtdfnm) throws SAXException, IOException, ParserConfigurationException {
        System.out.printf("Validating %s against DTD %s\n", xmlfnm, dtdfnm);
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        dbf.setValidating(true);
        DocumentBuilder db = dbf.newDocumentBuilder();
        db.setErrorHandler(new ErrorHandler() {
            public void error(SAXParseException ex) throws SAXException {
                System.out.println(ex.getMessage());
            }
            public void fatalError(SAXParseException ex) throws SAXException {
                System.out.println(ex.getMessage());
            }
            public void warning(SAXParseException ex) throws SAXException {
                System.out.println(ex.getMessage());
            }
        });
        db.setEntityResolver(new EntityResolver() {
            public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException {
                return new InputSource(dtdfnm);
            }
        });
        Document doc = db.parse(new File(xmlfnm));
    }
    public static void main(String[] args) throws Exception {
        testDTD("test1.xml", "test.dtd");
        testDTD("test2.xml", "test.dtd");
        testDTD("test3.xml", "test.dtd");
    }
}


Output:


Validating test1.xml against DTD test.dtd
Attribute "a" is required and must be specified for element type "rec".
Attribute "b" is required and must be specified for element type "rec".
Element type "a" must be declared.
Element type "b" must be declared.
The content of element type "rec" must match "EMPTY".
Attribute "a" is required and must be specified for element type "rec".
Attribute "b" is required and must be specified for element type "rec".
Element type "a" must be declared.
Element type "b" must be declared.
The content of element type "rec" must match "EMPTY".
Validating test2.xml against DTD test.dtd
Validating test3.xml against DTD test.dtd


Og det er jo korrekt: test1.xml matcher ikke test.dtd mens test2.xml og test3.xml matcher !
Avatar billede arne_v Ekspert
11. februar 2012 - 22:41 #14
Schema eksempel

test.xsd


<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            xmlns:test="http://arne/test"
            targetNamespace="http://arne/test"
            elementFormDefault="qualified">
  <xsd:complexType name="recType">
      <xsd:attribute name="a" type="xsd:nonNegativeInteger"/>
      <xsd:attribute name="b" type="xsd:nonNegativeInteger"/>
  </xsd:complexType>
  <xsd:element name="data">
      <xsd:complexType>
        <xsd:sequence>
            <xsd:element name="rec" type="test:recType" minOccurs="0" maxOccurs="unbounded"/>
        </xsd:sequence>
      </xsd:complexType>
  </xsd:element>
</xsd:schema>


test4.xml


<data xmlns="http://arne/test">
  <rec>
      <a>1</a>
      <b>2</b>
  </rec>
  <rec>
      <a>3</a>
      <b>4</b>
  </rec>
</data>


test5.xml


<data xmlns="http://arne/test">
  <rec a="1" b="2"/>
  <rec a="3" b="4"/>
</data>


test6.xml


<data xmlns="http://arne/test">
  <rec a="1" b="2"/>
  <rec a="3" b="4.5"/>
</data>


ValidateSchema.java


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

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

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

public class ValidateSchema {
    private static final String JAXP_SCHEMA_LANGUAGE = "http://java.sun.com/xml/jaxp/properties/schemaLanguage";
    private static final String W3C_XML_SCHEMA = "http://www.w3.org/2001/XMLSchema";
    private static final String JAXP_SCHEMA_SOURCE = "http://java.sun.com/xml/jaxp/properties/schemaSource";
    public static void testSchema(final String xmlfnm, final String xsdfnm) throws SAXException, IOException, ParserConfigurationException {
        System.out.printf("Validating %s against schema %s\n", xmlfnm, xsdfnm);
        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(xsdfnm));
        saxParser.parse(new File(xmlfnm), new DefaultHandler() {
            @Override
            public void error(SAXParseException ex) {
                System.out.println(ex.getMessage());
            }
            @Override
            public void warning(SAXParseException ex) {
                System.out.println(ex.getMessage());
            }
        });
    }
    public static void main(String[] args) throws Exception {
        testSchema("test4.xml", "test.xsd");
        testSchema("test5.xml", "test.xsd");
        testSchema("test6.xml", "test.xsd");
    }
}


output:


Validating test4.xml against schema test.xsd
cvc-complex-type.2.1: Element 'rec' must have no character or element information item [children], because the type's content type is empty.
cvc-complex-type.2.1: Element 'rec' must have no character or element information item [children], because the type's content type is empty.
Validating test5.xml against schema test.xsd
Validating test6.xml against schema test.xsd
cvc-datatype-valid.1.2.1: '4.5' is not a valid value for 'integer'.
cvc-attribute.3: The value '4.5' of attribute 'b' on element 'rec' is not valid with respect to its type, 'nonNegativeInteger'.


Og det er korrekt: test4.xml matcher ikke schema, test5.xml matcher schema og test6.xml matcher ikke schema selvom form er korrekt men n varedi er invalid (det kan ikke testes med DTD) !
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