PHP XML 预期响应开始标记,但我在 var_dump 中看到它
PHP XML response start tag expected, but i see it in var_dump
我收到了以下内容
var_dump:
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>"
我正在尝试使用 SimpleXML,但我首先使用此函数验证输出(抱歉,不记得我在 Whosebug 上找到它的位置):
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;
}
isXML()
的结果
Start tag expected, '<' not found at line 1. Bad XML: <?xml ve
我看到了“<”,除非 var_dump 不准确。我已经尽可能地分解了这件事。任何帮助将不胜感激。
我进一步简化了问题:
$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 仍然是 escaped/encoded,这是怎么回事?您在浏览器中看不到它,因为特殊字符由它解释。它将响应(包括 var_dump()
)视为 HTML。打开源视图查看实际值。
调试读取 XML 字符串的源代码,您可能需要更改它或在其中添加 html_entity_decode()
。
提示:您 XML 使用名称空间,因此您最好使用 DOM + Xpath。查看 DOMXpath::evaluate().
我收到了以下内容
var_dump:
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>"
我正在尝试使用 SimpleXML,但我首先使用此函数验证输出(抱歉,不记得我在 Whosebug 上找到它的位置):
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;
}
isXML()
的结果Start tag expected, '<' not found at line 1. Bad XML: <?xml ve
我看到了“<”,除非 var_dump 不准确。我已经尽可能地分解了这件事。任何帮助将不胜感激。
我进一步简化了问题:
$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 仍然是 escaped/encoded,这是怎么回事?您在浏览器中看不到它,因为特殊字符由它解释。它将响应(包括 var_dump()
)视为 HTML。打开源视图查看实际值。
调试读取 XML 字符串的源代码,您可能需要更改它或在其中添加 html_entity_decode()
。
提示:您 XML 使用名称空间,因此您最好使用 DOM + Xpath。查看 DOMXpath::evaluate().