Подтвердить что ты не робот

Как сообщить DOMDocument-> load(), какую кодировку я хочу использовать?

Я ищу и обрабатываю XML файлы из другого места, и мне нужно преобразуйте их с помощью некоторых XSLT. Нет проблем. Использование PHP5 и DOM библиотека, все в порядке. Работала хорошо, до сих пор. Сегодня, фанки символы были в XML файле - "умные" цитаты из Word, это выглядит как. В любом случае, DOMDocument- > load жаловался на них, говоря, что они не были UTF-8 и указывали кодировку.

Lo и вот, кодировка не указана в этих файлах XML. Если я добавить в 'encoding = "iso-8859-1" ' в заголовок, он отлично работает. Втир Я не контролирую эти XML файлы.

Чтение файла в строку, изменение его заголовка и запись его обратно выход в другое место кажется моим единственным вариантом, но я бы предпочел сделать он не должен использовать временные копии файлов XML вообще. Является там любой способ просто рассказать парсеру, чтобы разобрать их, как если бы они были изо-8859-1?

4b9b3361

Ответ 1

Это работает для вас?

$doc = new DOMDocument('1.0', 'iso-8859-1');
$doc->load($xmlPath);

Изменить:. Похоже, что это не работает, то, что вы могли бы сделать, похоже на ваш существующий метод, но без временного файла. Прочтите XML файл из своего источника, просто используя стандартные операции ввода-вывода (file_get_contents() или что-то еще), затем выполните любые изменения в необходимой кодировке (iconv() или utf8_decode()), а затем используйте loadXML()

$myXMLString = file_get_contents($xmlPath);
$myXMLString = utf8_decode($myXMLString);
$doc = new DOMDocument('1.0', 'iso-8859-1');
$doc->loadXML($myXMLString);

Ответ 2

Я не нашел способ установить кодировку по умолчанию (пока), но возможно режим восстановления в этом случае возможен.
Когда libxml обнаруживает ошибку кодирования и явно не кодируется, она переключается с unicode/utf8 на latin1 и продолжает разбирать документ. Но в контексте парсера свойство wellFormed установлено в 0/false. Расширение PHP DOM считает документ действительным, если wellFormed - true или атрибут объекта DOMDocument recover является истинным.

<?php
// german Umlaut ä in latin1 = 0xE4
$xml = '<foo>'.chr(0xE4).'</foo>';

$doc = new DOMDocument;
$b = $doc->loadxml($xml);
echo 'with doc->recover=false(default) : ', ($b) ? 'success':'failed', "\n";

$doc = new DOMDocument;
$doc->recover = true;
$b = $doc->loadxml($xml);
echo 'with doc->recover=true : ', ($b) ? 'success':'failed', "\n";

печатает

Warning: DOMDocument::loadXML(): Input is not proper UTF-8, indicate encoding !
Bytes: 0xE4 0x3C 0x2F 0x66 in Entity, line: 1 in test.php on line 6
with doc->recover=false(default) : failed

Warning: DOMDocument::loadXML(): Input is not proper UTF-8, indicate encoding !
Bytes: 0xE4 0x3C 0x2F 0x66 in Entity, line: 1 in  test.php on line 11
with doc->recover=true : success

Вы все еще получаете предупреждающее сообщение (которое может быть подавлено с помощью @$doc- > load()), и оно также будет отображаться в внутренних ошибках libxml (только один раз, когда парсер переключается с utf8 на latin1). Код ошибки для этой конкретной ошибки будет 9 (XML_ERR_INVALID_CHAR).

<?php
$xml = sprintf('<foo>
    <ae>%s</ae>
    <oe>%s</oe>
    &
</foo>', chr(0xE4),chr(0xF6));

libxml_use_internal_errors(true);
$doc = new DOMDocument;
$doc->recover = true;
libxml_clear_errors();
$b = $doc->loadxml($xml);
$invalidCharFound = false;
foreach(libxml_get_errors() as $error) {
    if ( 9==$error->code && !$invalidCharFound ) {
        $invalidCharFound = true;
        echo "found invalid char, possibly harmless\n";
    }
    else {
        echo "hm, that probably more severe: ", $error->message, "\n";
    }
}

Ответ 3

Одинаковый способ указать кодировку в объявлении XML в начале файла:

<?xml version="1.0" encoding="ISO-8859-1"?>