Linux за българи: Форуми

Програмиране => Общ форум => Темата е започната от: Nikolavp в Aug 26, 2007, 21:08



Титла: проблем с xml namespace при xsd файл
Публикувано от: Nikolavp в Aug 26, 2007, 21:08
Здравейте опитвам се да напиша xsd(schema файл) за група от xml файлове. Всичко вървеше перфектно до момента, в който трябваше да накарам няколкото от тях да станат валидни(2-3). Проблема е, че някои атрибути в таговете са от друг namespace и не знам как трябва да ги декларирам в
директивата на техния таг.
Примерен код
<xs:complexType name="blabla" >
</xs:complexType>
.
Пример:
Да кажем, че имам xml файла:
Примерен код

<?xml version="1.0" encoding="utf-8" xmlns:execute="http://www.einit.org/" ?>
<program>
   <editor execute:open="openfile:opendirectory"
              save="savefile:savedirectory"
/>
</program>

Някой ако може, да ми каже как да декларирам execute namespace-а ще му бъда много благодарен.
Благодаря предварително!!!





Титла: проблем с xml namespace при xsd файл
Публикувано от: rpetrov в Aug 28, 2007, 13:42
За схемата не трябва ли да е:
<xs:element name="blabla">
<xs:complexType>  ... ?

Цитат
...да ми каже как да декларирам execute namespace-а ...

Сигурно това се иска ??? :
<program xmlns:execute="http://www.einit.org/">...


Титла: проблем с xml namespace при xsd файл
Публикувано от: Nikolavp в Aug 28, 2007, 19:05
hmm и аз така мислех, че ще проработи, но ето ги примерите да не говоря на изуст :) и да видиш за какво става въпрос:
Това е xml файла
Примерен код
<einit prefix="services-virtual-module" xmlns:execute="http://www.einit.org/">
 <shell id="shell-postfix"
  name="postfix"
  uid="postfix"
  provides="mta:postfix"
  requires="network:mount-critical"
  enable="/usr/sbin/postfix start"
  disable="/usr/sbin/postfix stop"
  execute:reload="/usr/sbin/postfix reload" />
</einit>

Примерен код

<?xml version="1.0" encoding="utf-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:execute="http://www.einit.org/">
  <xs:attributeGroup name="module">
    <xs:attribute name="name" type="xs:string" use="required" />
    <xs:attribute name="provides" type="xs:string" use="required" />
    <xs:attribute name="requires" />
    <xs:attribute name="need-files" />
    <xs:attribute name="pid" />
    <xs:attribute name="id" use="required" />
    <xs:attribute name="restart" />
    <xs:attribute name="variable" />
    <xs:attribute name="options" />
    <xs:attribute name="variables" />
    <xs:attribute name="after" />
    <xs:attribute name="prepare" />
    <xs:attribute name="HOME" />
    <xs:attribute name="DISPLAY" />
    <xs:attribute name="before" />
    <xs:attribute name="gid" />
    <xs:attribute name="cleanup" />
    <xs:attribute name="uid" />
    <xs:attribute name="reload" />
    <xs:attribute name="on-shutdown" />
  </xs:attributeGroup>
  <xs:complexType name="shell">
    <xs:attributeGroup ref="module" />
    <xs:attribute name="disable" type="xs:string" />
    <xs:attribute name="enable" type="xs:string" />
  </xs:complexType>
  <xs:element name="einit">
    <xs:complexType>
      <xs:choice>
        <xs:element name="daemon" type="daemon" />
        <xs:element name="shell" type="shell" />
        <xs:element name="ifctl" type="network" />
        <xs:element name="ip" type="network" />
        <xs:element name="misc" type="network" />
      </xs:choice>
      <xs:attribute name="prefix" type="module_prefix" />
    </xs:complexType>
  </xs:element>
</xs:schema>
Пропуснах част от xsd файла, за да не стане много голям коментара. Та при тази ситуация ето какво ми дава xmllint:
Примерен код
../einit/modules/xml/data/modules-xml/postfix.xml:10: element shell: Schemas validity error : Element 'shell', attribute '{http://www.einit.org/}reload': The attribute '{http://www.einit.org/}reload' is not allowed.
../einit/modules/xml/data/modules-xml/postfix.xml fails to validate






Титла: проблем с xml namespace при xsd файл
Публикувано от: rpetrov в Aug 29, 2007, 15:20
Ей че сложна работа.

Чудя се, дали не трябваше, вместо name, да се използва ref="execute:reload". Tова ще изисква дефиниране на import  namespace
<xs:import namespace="http://www.einit.org/" schemaLocation=".....<path to file..." />  и във този xsd-файл да се опише attributе reload.


Титла: проблем с xml namespace при xsd файл
Публикувано от: rpetrov в Aug 30, 2007, 18:01
Цитат (rpetrov @ Авг. 29 2007,15:20)
Ей че сложна работа.

Чудя се, дали не трябваше, вместо name, да се използва ref="execute:reload". Tова ще изисква дефиниране на import  namespace
<xs:import namespace="http://www.einit.org/" schemaLocation=".....<path to file..." />  и във този xsd-файл да се опише attributе reload.

тествах това:
Примерен код
$ cat sample.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- einit prefix="services-virtual-module" xmlns:execute="http://www.einit.org/" -->
<einit xmlns:execute="http://www.einit.org/">
   <shell execute:reload="/usr/sbin/postfix reload" />
</einit>

Примерен код
$ cat sample.imp
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
      targetNamespace="http://www.einit.org/"
      xmlns="http://www.einit.org/">

   <xs:attribute name="reload" type="xs:string" />
</xs:schema>

Примерен код
$ cat sample.xsd
<?xml version="1.0" encoding="utf-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:execute="http://www.einit.org/" >

  <xs:import namespace="http://www.einit.org/" schemaLocation="sample.imp" />

  <xs:attributeGroup name="module">
       <xs:attribute ref="execute:reload" />
  </xs:attributeGroup>

  <xs:complexType name="shell">
       <xs:attributeGroup ref="module" />
       <xs:attribute name="disable" type="xs:string" />
       <xs:attribute name="enable" type="xs:string" />
   </xs:complexType>

   <xs:element name="einit">
       <xs:complexType>
           <xs:choice>
               <xs:element name="shell" type="shell" />
           </xs:choice>
           <!-- xs:attribute name="prefix" type="module_prefix" / -->
       </xs:complexType>
   </xs:element>
</xs:schema>

и се получи това
Цитат
$ xmllint --schema sample.xsd sample.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- einit prefix="services-virtual-module" xmlns:execute="http://www.einit.org/" -->
<einit xmlns:execute="http://www.einit.org/">
   <shell execute:reload="/usr/sbin/postfix reload"/>
</einit>
sample.xml validates