Как загрузить XML, когда PHP не может указать правильную кодировку? - PullRequest
2 голосов
/ 30 августа 2009

Я пытаюсь загрузить источник XML из удаленного местоположения, поэтому у меня нет контроля над форматированием. К сожалению, файл XML, который я пытаюсь загрузить, не имеет кодировки:

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql"> <NODE> </NODE> </ROOT>

При попытке что-то вроде:

$doc = new DOMDocument( );
$doc->load(URI);

Я получаю:

Input is not proper UTF-8, indicate encoding ! Bytes: 0xA3 0x38 0x2C 0x38

Я искал способы подавить это, но не повезло. Как мне загрузить это, чтобы я мог использовать его с DOMDocument?

Ответы [ 4 ]

1 голос
/ 20 марта 2015

Вам нужно конвертировать документ в UTF-8, проще всего будет использовать utf8_encode () .

Пример документа DOM:

$doc = new DOMDocument();
$content = utf8_encode(file_get_contents($url));
$doc->loadXML($content);

Пример SimpleXML:

$xmlInput = simplexml_load_string(utf8_encode(file_get_contents($url_or_file)));

Если вы не знаете текущую кодировку, используйте mb_detect_encoding () , например:

$content = utf8_encode(file_get_contents($url_or_file));
$encoding = mb_detect_encoding($content);
$doc = new DOMdocument();
$res = $doc->loadXML("<?xml encoding='$encoding'>" . $content);

Примечания:

  • Если кодировка не может быть обнаружена (функция вернет FALSE), вы можете попробовать принудительно кодировать с помощью utf8_encode () .
  • Если вместо этого вы загружаете html-код через $doc->loadHTML, вы все равно можете использовать заголовок XML.

Если вам известна кодировка, используйте iconv () для ее преобразования:

$xml = iconv('ISO-8859-1' ,'UTF-8', $xmlInput)
1 голос
/ 30 августа 2009

Вы можете отредактировать документ («предварительно обработать его»), чтобы указать кодировку, которую он доставляет, при добавлении декларации XML. Что это, вам придется выяснить, конечно. Объект DOM должен затем проанализировать его.

Пример объявления XML:

<?xml version="1.0" encoding="UTF-8" ?>
0 голосов
/ 13 января 2012

Я столкнулся с подобной ситуацией. Я получал XML-файл, который должен был быть в кодировке UTF-8, но в нем были некоторые некорректные символы ISO.

Я написал следующий код для кодирования плохих символов в UTF-8

<?php

# The XML file with bad characters
$filename = "sample_xml_file.xml";

# Read file contents to a variable
$contents = file_get_contents($filename);

# Find the bad characters
preg_match_all('/[^(\x20-\x7F)]*/', $contents, $badchars);

# Process bad characters if some were found
if(isset($badchars[0]))
{
        # Narrow down the results to uniques only
        $badchars[0] = array_unique($badchars[0]);

        # Replace the bad characters with their UTF8 equivalents
        foreach($badchars[0] as $badchar)
        {
                $contents = preg_replace("/".$badchar."/", utf8_encode($badchar), $contents);
        }
}

# Write the fixed contents back to the file
file_put_contents($filename, $contents);

# Cleanup
unset($contents);

# Now the bad characters have been encoded to UTF8
# It will now load file with DOMDocument
$dom = new DOMDocument();
$dom->load($filename);

?>

Более подробно я написал о решении по адресу: http://dev.strategystar.net/2012/01/convert-bad-characters-to-utf-8-in-an-xml-file-with-php/

0 голосов
/ 30 августа 2009

Вы можете попробовать использовать класс XMLReader . XMLReader разработан специально для XML и имеет опции для того, какую кодировку использовать (включая «ноль» для ни одного).

...