当架构无效时,如何禁用DOMDocument :: schemaValidate()生成的警告?

时间:2015-10-20 16:15:44

标签: php validation schema domdocument libxml2

为了避免架构验证过程中的PHP警告,可以使用@echo off ( for /f "delims=" %%a in (' findstr /r /c:"^ *<.*> *$" "%~dpnx0" ') do ( setlocal enableDelayedExpansion set "line=%%a" echo !line:MYUSERNAME=%USERNAME%! endlocal ) )>"somefile.txt" goto xmlEND :::::::::: XML BLOCK, EACH LINE MUST START WITH < AND END WITH > <?xml version="1.0" encoding="UTF-16" standalone="no"?> <Extensibility xmlns="http://schemas.microsoft.com/AutomationExtensibility"> <HostApplication> <Name>Microsoft SQL Server Management Studio</Name> <Version>*</Version> </HostApplication> <Addin> <FriendlyName>USAddin</FriendlyName> <Description>Union Square Addin for SQL Management Studio</Description> <Assembly>C:\Users\MYUSERNAME\Documents\Visual Studio 2010\Projects\USAddin\USAddin\bin\Debug\USAddin.dll</Assembly> <FullClassName>USAddin.Connect</FullClassName> <LoadBehavior>1</LoadBehavior> <CommandPreload>0</CommandPreload> <CommandLineSafe>0</CommandLineSafe> </Addin> </Extensibility> :xmlEND pause libxml_use_internal_errors(true);来手动使用#34;管理最终验证错误消息。当它与模式不匹配的XML时会起作用,但当模式本身无效时仍会触发警告。

libxml_get_errors()[0] -> message;已经在返回的错误数组中捕获了错误消息,警告对我来说似乎是多余的,绕过/禁用此特定警告的方法是什么?

我在严格模式下工作,所以当警告触发时我停止执行,并在数据库中记录错误,问题是PHP警告太模糊,所以我想绕过它来报告libxml错误一个单独的日志系统,然后看到详细的错误。

此警告是否是正确的行为?这有什么机会吗?

PHP代码:

libxml_use_internal_errors(true);

PHP警告:

  

DOMDocument :: schemaValidate():无效的架构

libxml详细错误消息:

  

元素&#39; {http://www.w3.org/2001/XMLSchema} complexType&#39;:内容   无效。预期是(注释?,(simpleContent |   complexContent | ((group | all | choice | sequence)?,((属性|   attributeGroup)*,anyAttribute?))))

无效架构(schema.xsd):

<?php
    $DD = new DOMDocument('1.0', 'ISO-8859-1');
    $DD -> loadXML('<?xml version ="1.0" encoding="ISO-8859-1"?><a></a>');
    libxml_use_internal_errors(true); // NO LIBXML WARNINGS
    $DD -> schemaValidate(__DIR__ . '/schema.xsd'); // Vague WARNING
    $errors = libxml_get_errors();

    if (isset($errors[0])) {
        echo $errors[0] -> message; // Libxml detailed message
    }
?>

1 个答案:

答案 0 :(得分:1)

这是我期望发生的事情。根据文档,DOMDocument :: schemaValidate基于模式验证文档。因此,如果架构本身无效,则无法用于验证文档。

您可以尝试使用@前缀命令 - 参见http://php.net/manual/en/language.operators.errorcontrol.php。这应该取消警告,允许您的代码继续。如果这不起作用,您可以尝试使用error_reporting(0)(http://php.net/manual/en/function.error-reporting.php)暂时禁用错误报告,然后再调用DOMDocument :: schemaValidate。然后,恢复先前调用error_reporting(0)时返回的设置。