[XML]Dúvidas sobre XML schema - key/ keyRef ou ID /IDRef

Dúvidas, problemas, novidades... se tem a ver com Informática, é aqui!
Avatar do Utilizador
tofas
Experiente
Experiente
Mensagens: 206
Registado: sexta-feira, 21 janeiro 2005 12:19

[XML]Dúvidas sobre XML schema - key/ keyRef ou ID /IDRef

Mensagem por tofas »

Boa noite,

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>
Peço que me comentem o que fiz, pois estou completamente a nora, sobre o que estou a fazer e estou muito confusa!!




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>

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">
  <!-- 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>

também este não temm erros e valida!

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!!

Avatar do Utilizador
tofas
Experiente
Experiente
Mensagens: 206
Registado: sexta-feira, 21 janeiro 2005 12:19

Mensagem por tofas »

boas,

para o problema que expôs a solução mais correcta seria usar o Key e o KeyRef, para os interessados na matéria, podem consultar a discussão no P@P:

http://www.portugal-a-programar.org/for ... 421.0.html

bom trabalho
tofas