Синтаксический анализ XML-тегов с дефисами не работает должным образом

Отчасти благодаря SO я смог выяснить, как я могу получить доступ к тегам XML с дефисами (<некоторые тег>). Все примеры, которые я видел, делают это примерно так.

$content = $xml->{'document-content'};

Но для меня это не работает, и это делает

$content = $xml->{document-content};

это без кавычек (как я понял, я не помню, может быть, ошибка). Если я использую кавычки, я получаю эту ошибку

Примечание. Попытка получить свойство необъекта в /html/my/dir/myfile.php в строке 26

Так что можно подумать, просто используйте его без кавычек. Конечно, пока я не пойму причину, по которой я анализирую XML. XML взят из ODT-файла и в конечном итоге будет использоваться в качестве шаблона для создания PDF-файлов. При разработке чего-либо я всегда использую сообщение об ошибке «E_ALL». Когда он установлен, я получаю эти 2 ошибки, когда использую его без кавычек.

Примечание: использование неопределенного константного документа — предполагаемый «документ» в /html/my/dir/myfile.php в строке 24

Примечание: использование неопределенного константного контента — предполагается «контент» в /html/my/dir/myfile.php в строке 24

Но он хорошо разбирает остальную часть документа. Проблема в том, что мне нужно создать PDF, и если он выводит эту ошибку «Notice» до того, как генератор PDF запустит «header», не будет установлен должным образом, и PDF не будет создан. Теперь можно предложить отключить создание отчетов об ошибках, но если PDF не работает, я не вижу этих ошибок.

По правде говоря, я в недоумении, почему это работает вообще без кавычек. Все, что я знаю о синтаксисе PHP, говорит о том, что без кавычек это будет константа (как указывает ошибка), которая должна быть определена где-то до нее. Таким образом, весь синтаксический анализатор должен потерпеть неудачу в этот момент, но это не так, на самом деле все наоборот, парсер работает.

В основном мне просто нужно знать, как избавиться от этих двух ошибок уведомления, не отключая отчеты об ошибках. И мне было бы очень интересно, почему это работает без кавычек, потому что, как это работает, похоже, резко отклоняется от всех норм программирования.

На всякий случай здесь нужен весь код, ведущий к «$ content»

$zip = new ZipArchive;

if ($zip->open('../docs/myfile.odt') === true)
{
$xmlstring = $zip->getFromName('content.xml');
$zip->close();
}

// remove all namespaces and swaps out tab and space tags
$replace = array('office:', 'style:', 'draw:', 'fo:', 'text:', 'svg:', '<tab/>', '<s/>');
$value = array('', '', '', '', '', '', "\t", '&#160;');
$xmlstring = str_replace($replace, $value, $xmlstring);

$xmlstring = preg_replace_callback('/<s c="(.+?)"\/>/s', 'ReplaceSpaces', $xmlstring);

$xml = simplexml_load_string($xmlstring);
$content = $xml->{document-content};

0

Решение

Я должен пнуть себя, я много лет разбирал XML-файлы и RSS-каналы, и ответ очень прост. Ты сделаешь не нужно ссылаться на основной элемент XML при использовании SimpleXML.

<document-content>
<tag1>
</tag1>
<tag2>
<anothertag>
</anothertag>
</tag2>
</document-content>

Так $xml->{document-content}->tag2 (или же $xml->{0}->tag2) точно так же, как $xml->tag2

Я предполагаю, что это был мой первый опыт работы с файлом odt, и, столкнувшись с некоторыми проблемами, я упустил очевидное.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]