2010-12-29 15 views
40

tôi đã cố gắng kiểm tra tính hợp lệ của chuỗi như xml sử dụng hàm simplexml_load_string()Docs này nhưng nó hiển thị rất nhiều thông báo cảnh báo.Làm thế nào kiểm tra xem một chuỗi là một XML hợp lệ không hiển thị một cảnh báo trong PHP

Làm thế nào tôi có thể kiểm tra xem một chuỗi là một XML hợp lệ mà không đàn áp (@ at the beginning) lỗi hiển thị một chức năng cảnh báo rằng expec

Trả lời

62

Sử dụng libxml_use_internal_errors() để ngăn chặn tất cả các lỗi XML, và libxml_get_errors () để lặp lại chúng sau đó.

Simple XML loading string

libxml_use_internal_errors(true); 

$doc = simplexml_load_string($xmlstr); 
$xml = explode("\n", $xmlstr); 

if (!$doc) { 
    $errors = libxml_get_errors(); 

    foreach ($errors as $error) { 
     echo display_xml_error($error, $xml); 
    } 

    libxml_clear_errors(); 
} 
+4

Đóng để hoàn thiện ... chỉ muốn nói thêm rằng chức năng display_xml_error chỉ đơn giản là một chức năng tùy chỉnh để xuất sai sót trong một cách tốt đẹp , nó có thể được tìm thấy ở đây http://php.net/manual/en/function.libxml-get-errors.php. Lúc đầu, tôi nghĩ rằng đó là một chức năng nội bộ mà tôi đã mất tích. – Carlton

+3

Hãy cẩn thận với 'if (! $ Doc)'! PHP xem xét ví dụ một tài liệu không gian tên là trống và do đó '! $ Doc === TRUE'. – David

+0

Tôi chạy vào vấn đề như @ David đề cập đến, tôi đã phải kiểm tra rõ ràng cho 'if ($ doc! == FALSE)' thay vì chỉ 'if ($ doc)' mà bình thường là đủ. – Samsquanch

13

Từ documentation:

Khắc phục lỗi XML khi tải tài liệu là một công việc rất đơn giản. Sử dụng chức năng libxml có thể triệt tiêu tất cả các lỗi XML khi tải tài liệu và sau đó lặp lại các lỗi.

Đối tượng libXMLError, trả về bởi libxml_get_errors(), chứa một số tài sản bao gồm các message, linecolumn (vị trí) của lỗi.

libxml_use_internal_errors(true); 
$sxe = simplexml_load_string("<?xml version='1.0'><broken><xml></broken>"); 
if (!$sxe) { 
    echo "Failed loading XML\n"; 
    foreach(libxml_get_errors() as $error) { 
     echo "\t", $error->message; 
    } 
} 

tham khảo: libxml_use_internal_errors

6

thử này một

//check if xml is valid document 
public function _isValidXML($xml) { 
    $doc = @simplexml_load_string($xml); 
    if ($doc) { 
     return true; //this is valid 
    } else { 
     return false; //this is not valid 
    } 
} 
+8

Câu hỏi được yêu cầu cụ thể cho một giải pháp không ngăn chặn các lỗi (sử dụng '@'). – GenericJon

1

Dưới đây là một mảnh nhỏ của lớp tôi đã viết một thời gian trước:

/** 
* Class XmlParser 
* @author Francesco Casula <[email protected]> 
*/ 
class XmlParser 
{ 
    /** 
    * @param string $xmlFilename Path to the XML file 
    * @param string $version 1.0 
    * @param string $encoding utf-8 
    * @return bool 
    */ 
    public function isXMLFileValid($xmlFilename, $version = '1.0', $encoding = 'utf-8') 
    { 
     $xmlContent = file_get_contents($xmlFilename); 
     return $this->isXMLContentValid($xmlContent, $version, $encoding); 
    } 

    /** 
    * @param string $xmlContent A well-formed XML string 
    * @param string $version 1.0 
    * @param string $encoding utf-8 
    * @return bool 
    */ 
    public function isXMLContentValid($xmlContent, $version = '1.0', $encoding = 'utf-8') 
    { 
     if (trim($xmlContent) == '') { 
      return false; 
     } 

     libxml_use_internal_errors(true); 

     $doc = new DOMDocument($version, $encoding); 
     $doc->loadXML($xmlContent); 

     $errors = libxml_get_errors(); 
     libxml_clear_errors(); 

     return empty($errors); 
    } 
} 

Nó hoạt động tốt với các dòng và vfsStream như chúng tôi sẽ cho mục đích thử nghiệm.

+0

thêm kiểm tra để tránh 'DOMDocument :: loadXML(): Chuỗi rỗng được cung cấp dưới dạng lỗi đầu vào' –

4

phiên bản của tôi như thế này:

//validate only XML. HTML will be ignored. 

function isValidXml($content) 
{ 
    $content = trim($content); 
    if (empty($content)) { 
     return false; 
    } 
    //html go to hell! 
    if (stripos($content, '<!DOCTYPE html>') !== false) { 
     return false; 
    } 

    libxml_use_internal_errors(true); 
    simplexml_load_string($content); 
    $errors = libxml_get_errors();   
    libxml_clear_errors(); 

    return empty($errors); 
} 

Các xét nghiệm:

//false 
var_dump(isValidXml('<!DOCTYPE html><html><body></body></html>')); 
//true 
var_dump(isValidXml('<?xml version="1.0" standalone="yes"?><root></root>')); 
//false 
var_dump(isValidXml(null)); 
//false 
var_dump(isValidXml(1)); 
//false 
var_dump(isValidXml(false)); 
//false 
var_dump(isValidXml('asdasds'));