estou com problemas para fazer um esquema em xml.
Tenho um diagrama em UML, onde tenho 3 classes: Empresa, Departamento e Empregado
(vou tentar mostrar o diagrama em uml que fiz... )
Empresa<>----Departamento (composição)
<>----Empregado (composição)
Empregado ( 1 )------ (*) Departamento (associação)
e eu pretendo criar um esquema xml para validar ficheiros que contenham a informação sobre o o diagrama anterior.
eu criei o seguinte ficheiro xml de exemplo:
Código: Selecionar todos
<?xml version="1.0" encoding="utf-8" ?>
<empresa
xmlns="http://example.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://example.com XMLSchemaTeste.xsd"
nome="SS"
contribuinte="123"
idEmpresa="empresa1">
<departamento sigla="AF" idDepart="departamento1">
<area> financeira </area>
</departamento>
<departamento sigla="AL" idDepart="departamento2">
<area> limpeza </area>
</departamento>
<empregado idEmp="empregado2">
<nome>Joao</nome>
<funcao>TOC</funcao>
<refDepartamento depart="departamento1"/>
</empregado>
</empresa>
e o respectivo XML Schema
Código: Selecionar todos
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://example.com" xmlns:example="http://example.com" targetNamespace="http://example.com" elementFormDefault="qualified" attributeFormDefault="unqualified">
<!-- empresa -->
<xs:element name="empresa">
<xs:complexType>
<xs:sequence>
<xs:element name="departamento" type="departType" maxOccurs="unbounded" />
<xs:element name="empregado" type="empType" maxOccurs="unbounded" />
</xs:sequence>
<xs:attribute name="nome" type="xs:string" use="required " />
<xs:attribute name="contribuinte" type="xs:integer" use="required" />
<xs:attribute name="idEmpresa" type="xs:ID" />
</xs:complexType>
</xs:element>
<!-- departType -->
<xs:complexType name="departType">
<xs:sequence>
<xs:element name="area" type="xs:string" />
</xs:sequence>
<xs:attribute name="idDepart" type="xs:ID" use="required" />
<xs:attribute name="sigla" type="xs:string" />
</xs:complexType>
<!-- empType -->
<xs:complexType name="empType">
<xs:sequence maxOccurs="unbounded">
<xs:element name="nome" type="xs:string" />
<xs:element name="funcao" type="xs:string" />
<xs:element name="refDepartamento">
<xs:complexType>
<xs:attribute name="depart" type="xs:IDREF" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="idEmp" type="xs:ID" use="required" />
</xs:complexType>
</xs:schema>
como podem reparar eu aqui estou a usar ID's para cada elemento e depois para poder refenciar no elemento empregado o departamento correspondente eu usei o IDREF.
Bem ele validou-me e não tenho erros....mas coloco dúvidas se estarei a fazer bem!!!
eu não quero cometer o erro de repetir informação, por exemplo, eu não quero que aconteço o seguinte:
(basta observar dentro do elemento empregado, coloquei um elemento departamento!)
Código: Selecionar todos
<?xml version="1.0" encoding="utf-8" ?>
<empresa
xmlns="http://example.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://example.com XMLSchemaTeste.xsd"
nome="SS"
contribuinte="123"
idEmpresa="empresa1">
<departamento sigla="AF" idDepart="departamento1">
<area> financeira </area>
</departamento>
<departamento sigla="AL" idDepart="departamento2">
<area> limpeza </area>
</departamento>
<empregado idEmp="empregado2">
<nome>Joao</nome>
<funcao>TOC</funcao>
<departamento sigla="AF" idDepart="departamento1">
<area> financeira </area>
</departamento>
</empregado>
</empresa>
Com análise em alguns livros e exemplos encontrei um exemplo que me confundiu e depois completamente baralhada.... que é o seguinte:
Código: Selecionar todos
<?xml version="1.0" encoding="utf-8" ?>
<Company
xmlns="http://example.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://example.com XMLSchemaExemplo.xsd">
<Departments>
<Department name="Human Resources" building="Building 1" departmentID="hr_dept"/>
<Department name="Development" building="Building 2" departmentID="development_dept"/>
<Department name="Testing" building="Building 2" departmentID="testing_dept"/>
</Departments>
<Employees>
<Employee name="Oliver" position="Developer" department="development_dept"/>
<Employee name="Mwatha" position="Developer" department="development_dept"/>
<Employee name="Soyapi" position="Developer" department="development_dept"/>
<Employee name="Mike" position="Testing" department="testing_dept"/>
</Employees>
</Company>
Código: Selecionar todos
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="http://example.com"
xmlns:example="http://example.com"
targetNamespace="http://example.com"
elementFormDefault="qualified"
attributeFormDefault="unqualified">
<!-- Company -->
<xs:element name="Company">
<xs:complexType>
<xs:sequence>
<!-- Departments-->
<xs:element name="Departments">
<xs:complexType>
<xs:sequence minOccurs="0" maxOccurs="unbounded">
<xs:element name="Department">
<xs:complexType>
<xs:attribute name="name" type="xs:string" />
<xs:attribute name="building" type="xs:string" />
<xs:attribute name="departmentID" type="xs:string" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<!-- Employees -->
<xs:element name="Employees">
<xs:complexType>
<xs:sequence minOccurs="0" maxOccurs="unbounded">
<xs:element name="Employee">
<xs:complexType>
<xs:attribute name="name" type="xs:string" />
<xs:attribute name="position" type="xs:string" />
<xs:attribute name="department" type="xs:string" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<!-- KeyDepartmentByID -->
<xs:key name="KeyDepartmentByID">
<xs:selector xpath="example:Departments/example:Department" />
<xs:field xpath="@departmentID" />
</xs:key>
<!-- RefEmployeeToDepartment -->
<xs:keyref name="RefEmployeeToDepartment" refer="example:KeyDepartmentByID">
<xs:selector xpath="example:Employees/example:Employee" />
<xs:field xpath="@department" />
</xs:keyref>
</xs:element>
</xs:schema>
Afinal que devo pensar eu e que devo eu fazer??? lolol :wallbash: :wallbash: :wallbash:
bom trabalho
tofas
p.s.: Já agora deixo aqui um excerto de um dado importante:
The <key> declaration, along with the <keyref> declaration, enables you to define a relationship between
two elements. The key/keyref mechanism functions similarly to database keys or to the ID/IDREF mechanism
built into XML DTDs. For example, an element might contain a <key> that is unique within a specified
context or scope. Another element can refer to the key using a <keyref> element. A <key> is always
defined inside an <element> declaration. It contains a <selector> element that defines the context or
scope of the key, and a <field> element that defines the specific key node. Like other elements, it can also
contain an <annotation>
Será que devo concluir que em xml schema devo usar o key e o keyref e o ID/IDREF é para DTD's??? bem sinceramente não sei o que pensar!!

