2014-02-23 3 views
0

Я пробую один простой пример PHP XML следующим образом.simplexml_load_string сбой при использовании параметра строки стиля heredoc

// code of PHP 
=================================================== 
<?php 
    $string = <<<XML 
<?xml version="1.0" encoding="ISO-8859-1"?> 
<note> 
<to>George</to> 
<from>John</from> 
<heading>Reminder</heading> 
<body>Don't forget the meeting!</body> 
</note> 
XML; 

    print "BEGIN</br>"; 
    print "String:</br>{$string}"; 

    $xml = simplexml_load_string($string); 
    print "</br>XML Obj:</br>"; 
    print_r($xml); 
    print "</br>Var Dump:</br>"; 
    var_dump($xml); 
    print "</br>END"; 
?> 
=================================================== 

и выходы кажется OK

// output 
=================================================== 
BEGIN 
String: 
George John Reminder Don't forget the meeting! 
XML Obj: 
SimpleXMLElement Object ([to] => George [from] => John [heading] => Reminder [body] => Don't forget the meeting!) 
Var Dump: 
object(SimpleXMLElement)#1 (4) { ["to"]=> string(6) "George" ["from"]=> string(4) "John" ["heading"]=> string(8) "Reminder" ["body"]=> string(25) "Don't forget the meeting!" } 
END 
=================================================== 

While, когда я пытаюсь форматировать первую строку строки Heredoc стиле, добавив некоторые пробелы перед ним, добавив две заготовки до следующего строки <?xml version="1.0" encoding="ISO-8859-1"?>, затем он всегда не смог вывести информацию об объекте $ xml.

// code of PHP 
=================================================== 
<?php 
    $string = <<<XML 
    <?xml version="1.0" encoding="ISO-8859-1"?> 
<note> 
<to>George</to> 
<from>John</from> 
<heading>Reminder</heading> 
<body>Don't forget the meeting!</body> 
</note> 
XML; 
... ... 
=================================================== 

// output 
=================================================== 
BEGIN 
String: 
George John Reminder Don't forget the meeting! 
XML Obj: 

Var Dump: 
bool(false) 
END 

Надеюсь, кто-то может мне помочь !!! Большое спасибо.

+2

Не ставьте пробелы перед прологом? Почему вы это делаете? – Wrikken

+1

+1 или используйте $ xml = simplexml_load_string (trim ($ string)); – sinisake

+0

Спасибо за вашу помощь, потому что это немного уродливо, поэтому я просто пытаюсь отформатировать его, ну, похоже, есть некоторые рекомендации по завершению ярлыка строки стиля heredoc, в то время как я не нашел никаких требований к содержимому строки и после форматирования содержимого строки он всегда терпит неудачу, и после нескольких попыток я нахожу только пустое, прежде чем первая строка содержимого строки влияет на результат, и мне интересно, поэтому я отправляю вопрос. –

ответ

1

Это недопустимый XML. Посмотрите на XML specs for documents:

document ::=  prolog element Misc* 
prolog  ::=  XMLDecl? Misc* (doctypedecl Misc*)? 
XMLDecl  ::=  '<?xml' VersionInfo EncodingDecl? SDDecl? S? '?>' 

document смачиваемой, что другие грамматики лексем XML документы строят из, начиная с prolog. Этот может содержит XMLDecl, который снова начинается с <?xml. Короче: перед декларацией нет пробелов, если таковой имеется.


Если вы находитесь под контролем XML (который вы, кажется): Просто не делай этого, я считаю, что это злонамеренный как все, чтобы иметь дело с кодом после вы будете удивляться, что происходит.

Если вы не можете изменить вход, потому что кто-то посылает сломанные XML файлы:

  • сказать ему, чтобы отправить хорошо сформированный XML или
  • «Preprocess» не-XML с trim($string), как уже было предложено в комментариях.
+0

Спасибо за вашу помощь, Дженс Эрат, я буду дополнительно подробно проверять спецификацию XML –