DTD, XML Schema, XSDL Helena Galhardas DEI IST
Feb 04, 2016
DTD, XML Schema, XSDL
Helena Galhardas
DEI IST
Agenda
Tipos de dados em XML: DTD XML Schema ou XSDL
XML DTD (Document Type Definition) Define uma classe de documentos Um documento XML pode ter uma DTD Terminologia para XML:
Bem formado: se as tags estão correctamente fechadas
Válido: se tem uma DTD e é conforme essa DTD Validação é útil em transferência de dados
Define: Nomes de elementos Estrutura do conteúdo dos elementos Nomes dos atributos Valores dos atributos por omissão Entidades
DTDs vistas como gramáticas
<!DOCTYPE paper [ <!ELEMENT paper (section*)> <!ELEMENT section ((title,section*) | text)> <!ELEMENT title (#PCDATA)> <!ELEMENT text (#PCDATA)>]>
<!DOCTYPE paper [ <!ELEMENT paper (section*)> <!ELEMENT section ((title,section*) | text)> <!ELEMENT title (#PCDATA)> <!ELEMENT text (#PCDATA)>]>
<paper> <section> <text> </text> </section> <section> <title> </title> <section> … </section> <section> … </section> </section></paper>
DTDs vistas como esquemasNão são tão adequadas pois:
Impõem restrições sobre a ordem que
não se pretende<!ELEMENT person (name,phone)>
Não se consegue impôr restrições sobre as referências Não conseguimos dizer que o atributo idref em
state-of tem que ser um identificador do elemento state
Podem ser demasiado vagas <!ELEMENT person ((name|phone|email)*)>
Exemplo: Uma DTD muito simples
<!DOCTYPE company [ <!ELEMENT company ((person|product)*)> <!ELEMENT person (ssn, name, office, phone?)> <!ELEMENT ssn (#PCDATA)> <!ELEMENT name (#PCDATA)> <!ELEMENT office (#PCDATA)> <!ELEMENT phone (#PCDATA)> <!ELEMENT product (pid, name, description?)> <!ELEMENT pid (#PCDATA)> <!ELEMENT description (#PCDATA)>]>
<!DOCTYPE company [ <!ELEMENT company ((person|product)*)> <!ELEMENT person (ssn, name, office, phone?)> <!ELEMENT ssn (#PCDATA)> <!ELEMENT name (#PCDATA)> <!ELEMENT office (#PCDATA)> <!ELEMENT phone (#PCDATA)> <!ELEMENT product (pid, name, description?)> <!ELEMENT pid (#PCDATA)> <!ELEMENT description (#PCDATA)>]>
Exemplo: um documento XML válido
<company> <person> <ssn> 123456789 </ssn> <name> John </name> <office> B432 </office> <phone> 1234 </phone> </person> <person> <ssn> 987654321 </ssn> <name> Jim </name> <office> B123 </office> </person> <product> ... </product> ...</company>
<company> <person> <ssn> 123456789 </ssn> <name> John </name> <office> B432 </office> <phone> 1234 </phone> </person> <person> <ssn> 987654321 </ssn> <name> Jim </name> <office> B123 </office> </person> <product> ... </product> ...</company>
Exemplo: Atributos em DTDs
<!ELEMENT person (ssn, name, office, phone?)><!ATTLIST person age CDATA #REQUIRED>
<!ELEMENT person (ssn, name, office, phone?)><!ATTLIST person age CDATA #REQUIRED>
<person age=“25”> <name> ....</name> ...</person>
<person age=“25”> <name> ....</name> ...</person>
Exemplo: Atributos em DTDs<!ELEMENT person (ssn, name, office, phone?)><!ATTLIST person age CDATA #REQUIRED
id ID #REQUIRED
manager IDREF #REQUIRED
manages IDREFS #REQUIRED>
<!ELEMENT person (ssn, name, office, phone?)><!ATTLIST person age CDATA #REQUIRED
id ID #REQUIRED
manager IDREF #REQUIRED
manages IDREFS #REQUIRED>
<person age=“25” id=“p29432” manager=“p48293” manages=“p34982 p423234”> <name> ....</name> ...</person>
<person age=“25” id=“p29432” manager=“p48293” manages=“p34982 p423234”> <name> ....</name> ...</person>
Atributos em DTDsTipos:
CDATA = string
ID = chave
IDREF = chave estrangeira
IDREFS = chaves estrangeiras separadas por espaços
(Monday | Wednesday | Friday) = enumeração
Qualificadores:
#REQUIRED
#IMPLIED = opcional
value = valor por omissão
value #FIXED = único valor permitido
Utilização de DTDs
Incluir no documento XML: A DTD completa
<!DOCTYPE rootElement [ ....... ]> Ou uma referência para ela
<!DOCTYPE rootElement SYSTEM “http://www.mydtd.org”>
Ou misturar as duas (por exemplo, para fazer “override” da definição externa)
Exercício
Considere uma BD relacional contendo uma relação “ensina” com atributos “disciplina” e “docente” tal como já vimos no exercício de XML.
Escreva uma DTD XML para representar esta informação.
Desvantagens das DTDs
Sintaxe não XML Não tem tipos de dados, em particular para o
conteúdo dos elementos Só é marginalmente compatível com
namespaces Não consegue usar conteúdo misto e obrigar
ordem e número de elementos filhos Nomes dos elementos são globais
XML Schema Generaliza DTDs Utiliza a sintaxe XML Descreve o conteúdo possível para documentos
XML É uma W3C Recommendation
XML Schema Part 0: Primer XML Schema Part 1: Structures XML Schema Part 2: Datatypes
Também referida como XSDL: XML Schema Definition Language
DTD vs XML Schema
DTD XML Schema
<!ELEMENT> declaration xsd:element element
<!ATTLIST> declaration xsd:attribute element
<!ENTITY> declaration n/a
#PCDATA content xsd:string type
n/a other data types
Tipos de dados simples e complexos XML Schema suporta a definição de tipos de dados
e a declaração de elementos e de atributos Tipos:
simples (inteiros, strings, ...) complexos (expressões regulares, como nas DTDs)
Alternância element-type-element: elemento raiz tem um tipo complexo que é uma expressão regular de elementos esses elementos têm os seus tipos complexos
... nas folhas, temos tipos simples
Estrutura da declaração de elementos xsd:sequence
Obriga a que os elementos ocorrem na ordem dada análogo a , em DTDs
xsd:choice Permite que um dos elementos dados ocorra Análogo a | em DTDs
xsd:all Permite que os elementos ocorram numa ordem
qualquer Análogo a & nas DTDs SGML
Definição do número de ocorrências dos elementos Os atributos minOccurs e maxOccurs
controlam o número de ocorrências de um elemento, sequence ou choice
minOccurs tem que ser um inteiro não negativo
maxOccurs tem que ser um inteiro não negativo ou sem limite
O valor por omissão para ambos é 1
Expressões regulares - resumoAlternância element-type-element:
<xsd:complexType name=“....”> [regular expression on elements] </xsd:complexType>
Expressões regulares: <xsd:sequence> A B C </...> = A B C <xsd:choice> A B C </...> = A | B | C <xsd:group> A B C </...> = (A B C) <xsd:... minOccurs=“0” maxOccurs=“unbounded”> ..</...> = (...)* <xsd:... minOccurs=“0” maxOccurs=“1”> ..</...> = (...)?
Exemplo<xsd:element name=“paper” type=“papertype”/>
<xsd:complexType name=“papertype”>
<xsd:sequence>
<xsd:element name=“title” type=“xsd:string”/>
<xsd:element name=“author” minOccurs=“0”/>
<xsd:element name=“year”/>
<xsd: choice> < xsd:element name=“journal”/>
<xsd:element name=“conference”/>
</xsd:choice>
</xsd:sequence>
</xsd:element>
<xsd:element name=“paper” type=“papertype”/>
<xsd:complexType name=“papertype”>
<xsd:sequence>
<xsd:element name=“title” type=“xsd:string”/>
<xsd:element name=“author” minOccurs=“0”/>
<xsd:element name=“year”/>
<xsd: choice> < xsd:element name=“journal”/>
<xsd:element name=“conference”/>
</xsd:choice>
</xsd:sequence>
</xsd:element>
DTD: <!ELEMENT paper (title,author?,year, (journal|conference))>
Elementos versus Tipos
<xsd:element name=“person”> <xsd:complexType> <xsd:sequence> <xsd:element name=“name” type=“xsd:string”/> <xsd:element name=“address” type=“xsd:string”/> </xsd:sequence> </xsd:complexType></xsd:element>
<xsd:element name=“person”> <xsd:complexType> <xsd:sequence> <xsd:element name=“name” type=“xsd:string”/> <xsd:element name=“address” type=“xsd:string”/> </xsd:sequence> </xsd:complexType></xsd:element>
<xsd:element name=“person” type=“ttt”><xsd:complexType name=“ttt”> <xsd:sequence> <xsd:element name=“name” type=“xsd:string”/> <xsd:element name=“address” type=“xsd:string”/> </xsd:sequence></xsd:complexType>
<xsd:element name=“person” type=“ttt”><xsd:complexType name=“ttt”> <xsd:sequence> <xsd:element name=“name” type=“xsd:string”/> <xsd:element name=“address” type=“xsd:string”/> </xsd:sequence></xsd:complexType>
DTD: <!ELEMENT person (name,address)>
Tipos locais e globais
Tipo local: <xsd:element name=“person”>
[define localmente o tipo da pessoa] </xsd:element>
Tipo global: <xsd:element name=“person” name=“ttt”/>
<xsd:complexType name=“ttt”> [define aqui o tipo ttt] </xsd:complexType>
Tipos globais podem ser reutilizados noutros elementos
Elementos locais versus elementos globais Elemento local: <xsd:complexType name=“ttt”>
<xsd:sequence> <xsd:element name=“address” type=“...”/>... </xsd:sequence> </xsd:complexType>
Elemento global: <xsd:element name=“address” type=“...”/>
<xsd:complexType name=“ttt”> <xsd:sequence> <xsd:element ref=“address”/> ... </xsd:sequence> </xsd:complexType>
Elementos globais como nas DTDs
Atributos Utilizar o elemento xsd:attribute dentro de um
xsd:complexType Tem atributos name, type Atributo use é opcional
Se omitido, então atributo é opcional Use = “required” para atributos obrigatórios Use = “fixed” para constantes Use = “default” value =“ ...” para valor por omissão
Para enumeração, usar xsd:SimpleType Atributos têm que ser declarados no fim de um
xsd:complexType
Exemplo
<xsd:element name=“paper” type=“papertype”/>
<xsd:complexType name=“papertype”>
<xsd:sequence>
<xsd:element name=“title” type=“xsd:string”/>
. . . . . .
</xsd:sequence>
<xsd:attribute name=“language" type="xsd:NMTOKEN" fixed=“English"/>
</xsd:complexType>
</xsd:element>
<xsd:element name=“paper” type=“papertype”/>
<xsd:complexType name=“papertype”>
<xsd:sequence>
<xsd:element name=“title” type=“xsd:string”/>
. . . . . .
</xsd:sequence>
<xsd:attribute name=“language" type="xsd:NMTOKEN" fixed=“English"/>
</xsd:complexType>
</xsd:element>
.
Conteúdo “Mixed”, Tipo “Any”
Melhor do que nas DTDs: pode assegurar o tipo, mas pode existir texto entre quaisquer elementos
Significa que qualquer coisa é permitida
<xsd:complexType mixed="true"> . . . .
<xsd:complexType mixed="true"> . . . .
<xsd:element name="anything" type="xsd:anyType"/> . . . .
<xsd:element name="anything" type="xsd:anyType"/> . . . .
Tipos de dados simples
String Token Byte unsignedByte Integer positiveInteger Int (larger than integer) unsignedInt Long Short ...
Time dateTime Duration Date ID IDREF IDREFS
Tipos de dados simples derivados (pelo utilizador) Tipos de dados complexos podem ser criados de
raiz Novos tipos de dados simples podem ser derivados
a partir de outros tipos de dados simples já existentes
Derivação pode ser: Extensão:
Lista: uma lista de valores de um determinado tipo União: permite valores de dois ou mais tipos de dados
Restrição: limita os valores permitidos usando: Valor máximo, valor mínimo, tamanho, número de dígitos,
enumeração, padrões (facetas)
Facetas de tipos simples
Exemplos: length minLength maxLength pattern enumeration whiteSpace
maxInclusive maxExclusive minInclusive minExclusive totalDigits fractionDigits
Propriedades adicionais que restringem um tipo simples 15 facetas definidas no XML Schema
Tipos derivados por extensões <complexType name="Address">
<sequence> <element name="street" type="string"/>
<element name="city" type="string"/>
</sequence>
</complexType>
<complexType name="USAddress">
<complexContent>
<extension base="ipo:Address">
<sequence> <element name="state" type="ipo:USState"/>
<element name="zip" type="positiveInteger"/>
</sequence>
</extension>
</complexContent>
</complexType>
<complexType name="Address">
<sequence> <element name="street" type="string"/>
<element name="city" type="string"/>
</sequence>
</complexType>
<complexType name="USAddress">
<complexContent>
<extension base="ipo:Address">
<sequence> <element name="state" type="ipo:USState"/>
<element name="zip" type="positiveInteger"/>
</sequence>
</extension>
</complexContent>
</complexType>
Corresponde a herança
Tipos derivados por restrições
<complexContent> <restriction base="ipo:Items“> … [rewrite the entire content, with restrictions]... </restriction> </complexContent>
<complexContent> <restriction base="ipo:Items“> … [rewrite the entire content, with restrictions]... </restriction> </complexContent>
Corresponde à inclusão de conjuntos
Exemplo de restrição por enumeração<xsd:element name="MScResult">
<xsd:simpleType> <xsd:restriction base="xsd:string">
<xsd:enumeration value="distinction"/> <xsd:enumeration value="merit"/>
<xsd:enumeration value="pass"/> <xsd:enumeration value="fail"/>
</xsd:restriction> </xsd:simpleType> </xsd:element> Conteúdo do elemento MScResult é uma restrição do
xsd:string type Tem que ser um dos quatro valores dados
e.g., <MScResult>pass</MScResult>
Tópicos próximas aulas
XSLT XPath XQuery
Referências Peter Wood, Slides on “Representing and Querying Data on the
Web”, http://www.dcs.bbk.ac.uk/~ptw/teaching/data-on-the-web.html.
Dan Suciu, Slides on “The semistructured data model”, CSE 590ds: Management of XML and Semistructured Data, http://www.cs.washington.edu/education/courses/cse590ds/01sp/
S. Abiteboul, P. Buneman, D. Suciu, “Data on the Web, From Relations to Semistructured Data and XML”, Morgan Kaufmann, 2000, (cap 3)
www.w3.org/TR/xmlschema-0 W3C's XML Schema Recommendation, Part 0: Primer
www.w3.org/TR/xmlschema-1 W3C's XML Schema Recommendation, Part 1: Structures
www.w3.org/TR/xmlschema-2 W3C's XML Schema Recommendation, Part 2: Datatypes
Subtle Use of Local Names
<xsd:element name=“A” type=“oneB”/>
<xsd:complexType name=“onlyAs”> <xsd:choice> <xsd:sequence> <xsd:element name=“A” type=“onlyAs”/> <xsd:element name=“A” type=“onlyAs”/> </xsd:sequence> <xsd:element name=“A” type=“xsd:string”/> </xsd:choice></xsd:complexType>
<xsd:element name=“A” type=“oneB”/>
<xsd:complexType name=“onlyAs”> <xsd:choice> <xsd:sequence> <xsd:element name=“A” type=“onlyAs”/> <xsd:element name=“A” type=“onlyAs”/> </xsd:sequence> <xsd:element name=“A” type=“xsd:string”/> </xsd:choice></xsd:complexType>
<xsd:complexType name=“oneB”> <xsd:choice> <xsd:element name=“B” type=“xsd:string”/> <xsd:sequence> <xsd:element name=“A” type=“onlyAs”/> <xsd:element name=“A” type=“oneB”/> </xsd:sequence> <xsd:sequence> <xsd:element name=“A” type=“oneB”/> <xsd:element name=“A” type=“onlyAs”/> </xsd:sequence> </xsd:choice></xsd:complexType>
<xsd:complexType name=“oneB”> <xsd:choice> <xsd:element name=“B” type=“xsd:string”/> <xsd:sequence> <xsd:element name=“A” type=“onlyAs”/> <xsd:element name=“A” type=“oneB”/> </xsd:sequence> <xsd:sequence> <xsd:element name=“A” type=“oneB”/> <xsd:element name=“A” type=“onlyAs”/> </xsd:sequence> </xsd:choice></xsd:complexType>
Arbitrary deep binary tree with A elements, and a single B element
Nomes locais<xsd:element name=“person”> <xsd:complexType> . . . . . <xsd:element name=“name”> <xsd:complexType> <xsd:sequence> <xsd:element name=“firstname” type=“xsd:string”/> <xsd:element name=“lastname” type=“xsd:string”/> </xsd:sequence> </xsd:element> . . . . </xsd:complexType></xsd:element>
<xsd:element name=“product”> <xsd:complexType> . . . . . <xsd:element name=“name” type=“xsd:string”/>
</xsd:complexType></xsd:element>
<xsd:element name=“person”> <xsd:complexType> . . . . . <xsd:element name=“name”> <xsd:complexType> <xsd:sequence> <xsd:element name=“firstname” type=“xsd:string”/> <xsd:element name=“lastname” type=“xsd:string”/> </xsd:sequence> </xsd:element> . . . . </xsd:complexType></xsd:element>
<xsd:element name=“product”> <xsd:complexType> . . . . . <xsd:element name=“name” type=“xsd:string”/>
</xsd:complexType></xsd:element>
nome tem significados diferentesem person eem product