期望PHP XML响应开始标记,但我在var_dump中看到它

时间:2015-08-21 09:53:09

标签: php xml parsing webex

我将返回以下内容

的var_dump:

StockAvailability.order('created_at DESC').first.qty

我正在尝试使用SimpleXML,但我首先使用此函数验证输出(抱歉,不记得我在stackoverflow上找到它的位置):

string(799) "<?xml version="1.0" encoding="ISO-8859-1"?> <serv:message xmlns:serv="http://www.webex.com/schemas/2002/06/service" xmlns:com="http://www.webex.com/schemas/2002/06/common" xmlns:att="http://www.webex.com/schemas/2002/06/service/attendee"><serv:header><serv:response><serv:result>SUCCESS</serv:result><serv:gsbStatus>BACKUP</serv:gsbStatus></serv:response></serv:header><serv:body><serv:bodyContent xsi:type="att:registerMeetingAttendeeResponse" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><att:register><att:attendeeID>29281003</att:attendeeID></att:register></serv:bodyContent></serv:body></serv:message>"

isXML()

的结果
function isXML($xml){
           libxml_use_internal_errors(true);

           $doc = new DOMDocument('1.0', 'utf-8');
           $doc->loadXML($xml);

           $errors = libxml_get_errors();

           if(empty($errors)){
               return true;
           }

           $error = $errors[0];
           if($error->level < 3){
               return true;
           }

           $explodedxml = explode("r", $xml);
           $badxml = $explodedxml[($error->line)-1];

           $message = $error->message . ' at line ' . $error->line . '. Bad XML: ' . htmlentities($badxml);
           return $message;
        }

我看到'&lt;',除非var_dump不准确。我尽可能地打破了这件事。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

我把问题再解决了一点:

$xml = '<?xml version="1.0" encoding="ISO-8859-1"?>
<serv:message xmlns:serv="http://www.webex.com/schemas/2002/06/service"/>';

// escape xml special chars - this will provoke the error
$xml = htmlspecialchars($xml);

$document = new DOMDocument();
$document->loadXml($xml);

输出:

Warning: DOMDocument::loadXML(): Start tag expected, '<' not found in Entity, line: 1 in /tmp/... 

您的XML仍然被转义/编码会发生什么。您没有在浏览器中看到它,因为它会解释特殊字符。它将响应(包括var_dump())视为HTML。打开源视图以检查实际值。

调试读取XML字符串的源,您可能想要更改它或在那里添加html_entity_decode()

提示:您使用的是名称空间,因此最好使用DOM + Xpath。查看DOMXpath::evaluate()