Как сообщить DOMDocument-> load(), какую кодировку я хочу использовать?
Я ищу и обрабатываю XML файлы из другого места, и мне нужно
преобразуйте их с помощью некоторых XSLT. Нет проблем. Использование PHP5 и DOM
библиотека, все в порядке. Работала хорошо, до сих пор. Сегодня, фанки
символы были в XML файле - "умные" цитаты из Word, это выглядит
как. В любом случае, DOMDocument- > load жаловался на них, говоря, что
они не были UTF-8 и указывали кодировку.
Lo и вот, кодировка не указана в этих файлах XML. Если я
добавить в 'encoding = "iso-8859-1" ' в заголовок, он отлично работает. Втир
Я не контролирую эти XML файлы.
Чтение файла в строку, изменение его заголовка и запись его обратно
выход в другое место кажется моим единственным вариантом, но я бы предпочел сделать
он не должен использовать временные копии файлов XML вообще. Является
там любой способ просто рассказать парсеру, чтобы разобрать их, как если бы они были
изо-8859-1?
Ответы
Ответ 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"?>