Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [XSD/XMLNS] Validacja XML z użyciem XML Schema zawodzi
Forum PHP.pl > Forum > PHP
wrzasq
Jest 1:34, nie spałem od niedzieli więc może przyczyna jest banalna. Jednak ja jej znaleźć nie mogę, a googlałem, szukałem w bugsach, na forum i w wielu innych miejscach pod przeróżnymi hasłami.

Problem brzmi: PHP nie chce mi interpretować domyślnych przestrzeni nazw w czasie parsowania XMLa przy użyciu XML Schema.

W wersji okrojonej, która jednak nadal powoduje takie same objawy:

plik XML Schema:
  1. <?xml version="1.0" encoding="utf-8"?>
  2.  
  3. <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:myNS" xmlns="urn:myNS" xmlns:wf="urn:myNS">
  4.  
  5.    <!-- protocol version -->
  6.    <xsd:attribute name="version" type="xsd:string" fixed="0.0.1">
  7.        <xsd:annotation>
  8.            <xsd:documentation xml:lang="en">Current version of protocol. At the moment only "0.0.1" is supported.</xsd:documentation>
  9.        </xsd:annotation>
  10.    </xsd:attribute>
  11.  
  12.    <!-- backed XML format -->
  13.    <xsd:complexType name="transport">
  14.        <xsd:annotation>
  15.            <xsd:documentation xml:lang="en">Structure of backend XML protocol.</xsd:documentation>
  16.        </xsd:annotation>
  17.        
  18.        <xsd:attribute ref="wf:version" use="required" />
  19.    </xsd:complexType>
  20.  
  21.    <!-- root node -->
  22.    <xsd:element name="transport" type="wf:transport">
  23.        <xsd:annotation>
  24.            <xsd:documentation xml:lang="en">Root element for XML backend protocol.</xsd:documentation>
  25.        </xsd:annotation>
  26.    </xsd:element>
  27.  
  28. </xsd:schema>


plik docelowy:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <transport xmlns="urn:myNS" version="0.0.1" />


walidowanie:
  1. <?php
  2.  
  3. $xml = new DOMDocument();
  4. $xml->load('plik.xml');
  5. $xml->schemaValidate('schema.xsd');
  6.  
  7. ?>


efekt:
Cytat
Warning: DOMDocument::schemaValidate(): Element '{urn:myNS}transport', attribute 'version': The attribute 'version' is not allowed. in /home/wrzasq/public_html/test.php on line 34

Warning: DOMDocument::schemaValidate(): Element '{urn:myNS}transport': The attribute '{urn:myNS}version' is required but missing. in /home/wrzasq/public_html/test.php on line 34


Jak widać problem jest z przestrzenią nazw. Mimo zadeklarowania domyślnej, PHP nadal nie traktuje atrybutu jako należącego do danej przestrzeni. Co ciekawe ten problem nie dotyczy elementów (tak jak mówiłem to wersja okrojona do lepszego zobrazowania problemu - w wersji pełnej typy danych są dużo bardziej złożone, ale jednak elementy są traktowane poprawnie jako należące do domyślnej przestrzeni nazw).
ddiceman
Sprawdzalem narzedziem do validowania (a nie PHP) wiec sprawdz:
  1. <?xml version="1.0" encoding="utf-8"  ?>
  2. <transport xmlns="urn:myNS" xmlns:myNS="urn:myNS" myNS:version="0.0.1"/>
wrzasq
Tak, to zadziała, ale właśnie problem w tym, żeby nie trzeba było do atrybutów dółączać namespace'a. Nie wiem czy tak się da, bo nie jestem w sumie guru XSD, ale wydaje mi się, że powinno je też traktować jak z domyślnej przestrzeni :S.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.