2017-09-14 65 views
0

我已经知道如何验证一个单一的xsd与PHP程序,我仍然有一个问题标签在xsd验证时,我按照本教程https://www.tutorialspoint.com/xsd/xsd_complex_any.htm,以下是我的演示:如何验证xml与php当我有多个架构文件

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> 

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


?> 

现在我的问题是如何验证的test.xml与person.xsd和child.xsd。你能给我一些提示吗?

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

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

现在我可以通过几个XSD具有相同的PHP验证计划验证我的XML

非常感谢

如果您有其他的解决方案,请分享你的想法:)

回答

1

如果我理解正确的,你的问题相当于:如何让我的XSD验证程序加载(并构建出一个模式)person.xsd和child.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

非常感谢您的建议,我似乎找到了解决方案。你能否帮我检查一下我已经参加过我的问题的解决方案 –