1

私は以下を返しています

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 を使用しようとしていますが、最初にこの関数を使用して出力を検証しています (申し訳ありませんが、stackoverflow で見つけた場所を思い出せません):

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: &lt;?xml ve

var_dump が不正確でない限り、「<」が表示されます。私はできる限りこのことを分解しました。どんな助けでも大歓迎です。

4

1 に答える 1

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()そこに を追加することをお勧めします。

ヒント:あなたは XML で名前空間を使用しているので、DOM + Xpath を使用したほうがよいかもしれません。DOMXpath::evaluate()を確認してください。

于 2015-08-21T10:12:05.897 に答える