2017-09-14 1 views
0

J'ai déjà su comment valider un seul xsd avec le programme php, j'ai toujours un problème avec le label <xs:any> en validation xsd quand je suis ce tutoriel https://www.tutorialspoint.com/xsd/xsd_complex_any.htm, ce qui suit est ma démo:comment valider xml avec php quand j'ai plusieurs documents de schéma

Person.xsd

<?xml version="1.0" encoding="UTF-8"?> 
    <xs:schema 
    xmlns="http://cos-git.dev" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://cos-git.dev" 
    elementFormDefault="qualified"> 

    <xs:element name="persons"> 
     <xs:complexType> 
     <xs:sequence> 
      <xs:element name="person" maxOccurs="unbounded"> 
      <xs:complexType> 
       <xs:sequence> 
       <xs:element name="full_name" type="xs:string"/> 
       <xs:element name="child_name" type="xs:string" minOccurs="0" maxOccurs="5"/> 
       <xs:any minOccurs = "0"/> 
       </xs:sequence> 
      </xs:complexType> 
      </xs:element> 
     </xs:sequence> 
     </xs:complexType> 
    </xs:element> 

    </xs:schema> 

et mon child.xsd

<?xml version="1.0" encoding="UTF-8"?> 
    <xs:schema 
     xmlns="http://www.w3school.com.cn" 
     xmlns:xs="http://www.w3.org/2001/XMLSchema" 
     targetNamespace="http://www.w3school.com.cn" 
     elementFormDefault="qualified"> 

     <xs:element name="children"> 
      <xs:complexType> 
      <xs:sequence> 
       <xs:element name="childname" type="xs:string" 
       maxOccurs="unbounded"/> 
      </xs:sequence> 
      </xs:complexType> 
     </xs:element> 
    </xs:schema> 

et mon fichier test.xml est comme suit:

<persons xmlns="http://cos-git.dev" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://cos-git.dev person.xsd http://www.w3school.com.cn child.xsd"> 
    <person> 
     <full_name>Tony Smith</full_name> 
     <child_name>Cecilie</child_name> 
     <children> 
      <childname>Name</childname> 
     </children> 
    </person> 
</persons> 

programme php validate simple est la suivante:

<?php 
function libxml_display_error($error) 
{ 
    $return = "<br/>\n"; 
    switch ($error->level) { 
     case LIBXML_ERR_WARNING: 
     $return .= "<b>Warning $error->code</b>: "; 
     break; 
     case LIBXML_ERR_ERROR: 
     $return .= "<b>Error $error->code</b>: "; 
     break; 
     case LIBXML_ERR_FATAL: 
     $return .= "<b>Fatal Error $error->code</b>: "; 
     break; 
    } 
    $return .= trim($error->message); 
    if ($error->file) { 
     $return .= " in <b>$error->file</b>"; 
    } 
    $return .= " on line <b>$error->line</b>\n"; 

    return $return; 
} 

function libxml_display_errors() { 
    $errors = libxml_get_errors(); 
    var_dump($errors);exit; 
    foreach ($errors as $error) { 
     print libxml_display_error($error); 
    } 
    libxml_clear_errors(); 
} 

// Enable user error handling 
libxml_use_internal_errors(true); 

$xml = new DOMDocument(); 
$xml->load('xmlfilepath'); 

if ($xml->schemaValidate('xsdfilename')) { 
    echo "validated</n>"; 

}else{ 
    libxml_display_errors(); 
} 


?> 

Maintenant, mon problème est que la façon de valider test.xml avec Person.xsd et child.xsd. Pourriez-vous me donner quelques conseils?

==============

Merci pour CM Sperberg-McQueen pour me donner quelques conseils pour créer un autre fichier nommé driver.xsd pour résoudre mon problème

Le Voici ma solution:

driver.xsd

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
<xs:import namespace="http://cos-git.dev" schemaLocation="person.xsd"/> 
<xs:import namespace="http://www.w3school.com.cn" schemaLocation="child.xsd"/> 
</xs:schema> 

et mon test.xml

<?xml version="1.0" encoding="UTF-8"?> 

<persons xmlns="http://cos-git.dev" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:r="http://www.w3school.com.cn"> 
    <person > 
     <full_name>Tony Smith</full_name> 
     <child_name>Cecilie</child_name> 
     <r:children > 
      <r:childname>Name</r:childname> 
      <r:childname>Name1</r:childname> 
     </r:children> 
    </person> 
</persons> 

maintenant je peux valider mon xml par plusieurs xsd avec un même programme de validation php

Merci beaucoup

Si vous avez une autre solution s'il vous plaît partager votre idée :)

Répondre

1

Si je comprends bien, votre La question revient à: comment obtenir mon validateur XSD pour charger (et construire un schéma sur) à la fois person.xsd et child.xsd? La réponse dépendra en principe de votre validateur; vérifiez sa documentation. De nombreux validateurs vous permettent de spécifier plusieurs documents de schéma au moment où vous les appelez. Si vous ne trouvez pas de documentation pour votre validateur de schéma qui répond à votre question, ou si votre valideur n'accepte qu'un seul document de schéma (ou URI pour tel) lors de l'exécution, alors la chose la plus simple à faire serait de: http://www.youtube.com/support faire un document de schéma appelé driver.xsd dont le contenu sera quelque chose comme ça (non testé):

<xsd:schema ...> 
    <xsd:import namespace="http://cos-git.dev" 
    schemaLocation=".../person.xsd"/> 
    <xsd:import namespace="http://www.w3school.com.cn" 
    schemaLocation=".../child.xsd"/> 
</xsd:schema> 

Lorsque vous validez sur le document de schéma driver.xsd, on vous dira que le type complexe pour « personne » est non-déterministe: parce que votre joker correspond à l'élément 'child_name', un élément 'child_name' dans l'entrée peut correspondre à l'élément local de ce nom ou à un élément global non déclaré de t nom. L'analyseur ne voudra pas deviner de quoi il s'agit. Le moyen le plus simple de réparer ce problème consiste à ajouter namespace="##other" au caractère générique.

+0

Merci beaucoup pour vos conseils, il me semble trouver une solution. Pourriez-vous me rendre un service pour vérifier ma solution dont j'ai déjà traité ma question? –