2012-09-20 169 views
4

是否可以使用存储在字符串中的XSD shema验证SimpleXMLElement?使用XSD进行PHP SimpleXMLElement验证

我得到这个XML低谷卷曲:

<production_feedback> 
     <production_number>DA1100208</production_number> 
    <production_status>DONE</production_status> 
</production_feedback> 

在我身边我得到这样的:

if ($_SERVER['REQUEST_METHOD'] === 'POST'){ 

    $post_text = file_get_contents('php://input'); 

    $xml = new SimpleXMLElement($post_text); 

    error_log(print_r($xml , true)); 
    } 

这是我error_log()

SimpleXMLElement Object\n(\n [production_number] => DA1100208\n [production_status] => PRODUCTION_IN_PROGRESS\n)\n 

,所以我可以用Xpath访问数据。这很好。我想用XSD验证它。是否有可能,或者有没有其他方法2用XSD字符串验证XML字符串?

这是我的XSD BTW存储在一个变量:

$production_XSD ='<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="production_feedback"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element type="xs:string" name="production_number"/> 
     <xs:element type="xs:string" name="production_status"/> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
</xs:schema>' 

回答

5

为SimpleXMLElement类不支持(只要在php.net的文档是最新的)。

DOMDocument提供了使用DOMDocument :: schemaValidateSource方法查找的功能。

----原

然而,XMLReader类具有可用于验证对一个XSD 文件中的setSchema方法(这不正是你要找的,但是这是我的发现,而无需依赖对任何外部库)

+0

我必须将字符串保存到xml文件才能使用xml读取器或? –

+0

是的,我认为是。 (你可以直接写下这个文件,然后再删除它,但我不知道你是否想这样做) 当使用RelaxNG Schema时,你可以直接将模式字符串传递给setRelaxNGSchemaSource方法(但是,不知道放松NG,所以我不能告诉你这是否是一种好的方法)。 –

+0

我刚刚找到[DOMDocument](http://php.net/manual/de/class.domdocument.php)类,它支持使用DOMDocument :: schemaValidateSource方法根据模式字符串验证XML。你可能想尝试一下。 –

0

我最近需要验证包含对XSD文件的XML字符串变种,因此,如果其他人正在寻找这种解决方案,请参阅以下内容:

// $xml_feed is a string containing your XML content 
// validate xml string with xsd file 
$doc = new DOMDocument(); 
$doc->loadXML($xml_feed); // load xml 
$is_valid_xml = $doc->schemaValidate('XSDs/FeedFile.xsd'); // path to xsd file 

if (!$is_valid_xml){ 
    echo '<b>Invalid XML:</b> validation failed<br>'; 
}else{ 
    echo '<b>Valid XML:</b> validation passed<br>'; 
} 

如果你还有你的XSD存储在一个字符串中,那么用包含你的XSD的var替换'XSDs/FeedFile.xsd'..希望有人认为这有帮助!