Oprettet tir. d. 07. februar 2012 kl. 22:06:21

juliemusen
juliemusen (1.105 point. Point ude: 300)

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

Skrevet tir. d. 07. februar 2012 kl. 22:31:49| #1

arne_v
arne_v (1.016.169 point)
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.

Skrevet tir. d. 07. februar 2012 kl. 22:33:03| #2

arne_v
arne_v (1.016.169 point)
DTD definerer kun element og attributter.

Schema giver mulighed for at angive restriktioner paa vaerdier og for at angive namespaces.

Skrevet tir. d. 07. februar 2012 kl. 23:30:52| #3

juliemusen
juliemusen (1.105 point)
"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?

Skrevet ons. d. 08. februar 2012 kl. 01:34:55| #4

arne_v
arne_v (1.016.169 point)
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.

Skrevet ons. d. 08. februar 2012 kl. 01:37:18| #5

arne_v
arne_v (1.016.169 point)
<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

Skrevet ons. d. 08. februar 2012 kl. 16:55:35| #6

juliemusen
juliemusen (1.105 point)
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 :-)

Skrevet ons. d. 08. februar 2012 kl. 17:05:42| #7

arne_v
arne_v (1.016.169 point)
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

Skrevet ons. d. 08. februar 2012 kl. 17:07:00| #8

arne_v
arne_v (1.016.169 point)
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.

Skrevet ons. d. 08. februar 2012 kl. 17:07:08| #9

arne_v
arne_v (1.016.169 point)
og et svar

Skrevet ons. d. 08. februar 2012 kl. 19:43:11| #10

juliemusen
juliemusen (1.105 point)
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?

Skrevet ons. d. 08. februar 2012 kl. 20:18:08| #11

arne_v
arne_v (1.016.169 point)
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

Skrevet lør. d. 11. februar 2012 kl. 21:21:41| #12

juliemusen
juliemusen (1.105 point)
ok mange tak :-)

Skrevet lør. d. 11. februar 2012 kl. 22:37:37| #13

arne_v
arne_v (1.016.169 point)
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 !

Skrevet lør. d. 11. februar 2012 kl. 22:41:53| #14

arne_v
arne_v (1.016.169 point)
Schema eksempel

test.xsd


<xsd:schema xmlns:xsd="http://www.w3.org/ (...)
            xmlns:test="http://arne/ (...)
            targetNamespace="http://arne/ (...)
            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/ (...)
  <rec>
      <a>1</a>
      <b>2</b>
  </rec>
  <rec>
      <a>3</a>
      <b>4</b>
  </rec>
</data>


test5.xml


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


test6.xml


<data xmlns="http://arne/ (...)
  <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/ (...)
    private static final String W3C_XML_SCHEMA = "http://www.w3.org/ (...)
    private static final String JAXP_SCHEMA_SOURCE = "http://java.sun.com/ (...)
    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) !

Skriv et indlæg




Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] [img]link til billede[/img]
Web- og emailadresser omdannes automatisk til links

Log ind

   

   

Seneste spørgsmål

mysqli_stmt::store_result() expects exactly 0 parameters,

Oprettet den 25. maj 2012 kl. 23.52
tobrukDk giver 25 point for svar | Giv et svar »

Hjælp til php login

Oprettet den 23. maj 2012 kl. 16.31
andersx giver 60 point for svar | Giv et svar »

Hvilke sprog er gode til følgende?

Oprettet den 21. maj 2012 kl. 09.48
Blueeyez giver 30 point for svar | Giv et svar »



   




Tips & Tricks fra PC World

Teaser billede

Læserne: Her er vores værste it-indkøb

Det er ikke al it-udstyr, som er det rene guld. Her er nogle af læsernes skrækhistorier.


Anmeldelser fra PC World

Teaser billede

Test: Mobil med Ferrari-design - og en Trabant-motor

Motorola har begået endnu en smartphone med lækkert design og potentiale til at være blandt de bedste. Men den når ikke i mål. Se her hvorfor.


Seneste blogindlæg

Teaser billede

Tvangslukke spørgsmål: Hvad er den bedste løsning?

Hej Vi har mange åbne spørgsmål på Eksperten. Vi ville gerne tvangslukke dem - så et spørgsmål efter f.eks. 6 måneder lukkes. Men der er et par uklarheder som ville være gode at få lidt input til:...


Nyheder fra PC World

Teaser billede

Sådan siger du farvel til Facebook

Læs her, hvordan du dropper Facebook og i stedet anvender nogle brugervenlige alternativer, så du stadig kan være social på nettet.


Nyheder fra Computerworld

Teaser billede

Galleri: De fedeste håndholdte gennem 40 år

Her har du de mest banebrydende håndholdte computere gennem alle tider.


Kurser
Samarbejdspartnere

Udgiver · © 2012 IDG Danmark A/S · Hørkær 18 · 2730 Herlev · Tlf.: 77 300 300 · Fax: 77 300 301 · Brug af personoplysninger