2017-09-14 10 views
0

PHPチュートリアルhttps://www.tutorialspoint.com/xsd/xsd_complex_any.htmに従うと、xsdの検証で<xs:any>というラベルに問題があります。私のデモ:複数のスキーマ文書を持っているときにxmlをPHPで検証する方法

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

をperson.xsdを

と私の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> 

と私のtest.xmlファイルは以下の通りです:

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

単一検証のPHPプログラムは以下の通りです:

<?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(); 
} 


?> 

今、私の問題は、どのようにperson.xsdをしてchild.xsdでのtest.xmlを検証することです。いくつかのヒントを教えていただけますか?

============== CM Sperberg-マックイーンのため

おかげで私の問題を解決するためにdriver.xsdという名前の別のファイルを作成するために私にいくつかのヒントを与えるために

以下は私のソリューションです:

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> 

と私の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> 

今私はあなた、あなたは別の解決策を持っている場合は、多く

おかげで、あなたのアイデアを共有してください:)

答えて

1

を私が正しく理解していれば、同じPHPの検証プログラムで数XSDで私のXMLを検証することができます質問は次のようになります:person.xsdとchild.xsdの両方をロードする(そしてスキーマをビルドする)ために、どのようにしてXSDバリデーターを取得するのですか?答えは原則としてバリデーターに依存します。そのドキュメントを確認してください。多くのバリデーターでは、呼び出すときに複数のスキーマ文書を指定することができます。

あなたの質問に答えるスキーマバリデータのドキュメントが見つからない場合、またはバリデータが実行時に単一のスキーマドキュメント(またはそのようなURI)を受け入れる意思がある場合、最も簡単なことはスキーマ文書を作成し、その内容はこのような何か(テストしていません)になりますdriver.xsdと呼ば:

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

あなたはdriver.xsdスキーマ文書に対して検証ないとき、あなたは「人のための複合型であることを指示されます非決定的:ワイルドカードが 'child_name'要素と一致するため、入力の 'child_name'要素は、その名前のローカル要素または宣言されていないグローバル要素名前。パーサは、意味するものを推測することはできません。その問題を修復する最も簡単な方法は、ワイルドカードにnamespace="##other"を追加することです。

+0

アドバイスをいただきありがとうございます。私は解決策を見つけるようです。あなたは既に私の質問に出席した私の解決策をチェックするために私に恩恵を与えることができますか –

関連する問題