1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

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

Discussão em 'Programação' iniciada por tofas, 25 de Novembro de 2007. (Respostas: 0; Visualizações: 1365)

  1. Boa noite,

    estou com problemas para fazer um esquema em xml.
    Em anexo podemos ver um diagrama em UML, onde tenho 3 classes: Empresa, Departamento e Empregado

    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:
    
    <?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:
    <?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:
    
    <?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:
    
    <?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:
    
    <?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:


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

Partilhar esta Página