Ошибка неверного символа PHP - PullRequest
7 голосов
/ 15 декабря 2011

Я получаю эту ошибку при запуске этого кода: Fatal error: Uncaught exception 'DOMException' with message 'Invalid Character Error' in test.php:29 Stack trace: #0 test.php(29): DOMDocument->createElement('1OhmStable', 'a') #1 {main} thrown in test.php on line 29

Узлы, которые из исходного XML-файла содержат недопустимые символы, но поскольку я удаляю недопустимые символы из узлов, узлы должны быть созданы. Какой тип кодирования мне нужно сделать в исходном XML-документе? Нужно ли декодировать saveXML?

function __cleanData($c) 
{
    return preg_replace("/[^A-Za-z0-9]/", "",$c);
}
$xml = new DOMDocument('1.0', 'UTF-8');
$xml->load('test.xml');    
$xml->formatOutput = true; 

$append = array();
foreach ($xml->getElementsByTagName('product') as $product ) 
    {
        foreach($product->getElementsByTagName('name') as $name ) 
        {

            $append[] = $name;
        }
                foreach ($append as $a)  
                {
                    $nodeName = __cleanData($a->textContent);

                        $element = $xml->createElement(htmlentities($nodeName) , 'a');
                }
        $product->removeChild($xml->getElementsByTagName('details')->item(0));
        $product->appendChild($element);
    }

$result = $xml->saveXML();
$file = "data.xml";
file_put_contents($file,$result);

Вот как выглядит оригинальный XML:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="/v1/xsl/xml_pretty_printer.xsl" type="text/xsl"?>
<products>
<product>
<modelNumber>M100</modelNumber>
<itemId>1553725</itemId>
<details>
  <detail>
    <name>1 Ohm Stable</name>
    <value>600 x 1</value>
  </detail>
 </details>
</product>
 </products>

Новый документ должен выглядеть следующим образом:

 <?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="/v1/xsl/xml_pretty_printer.xsl" type="text/xsl"?>
<products>
<product>
<modelNumber>M100</modelNumber>
<itemId>1553725</itemId>
  <1 Ohm Stable>

  </1 Ohm Stable>

  </product>
 </products>

Ответы [ 4 ]

12 голосов
/ 15 декабря 2011

Просто нельзя использовать имя элемента, начинающееся с номера

1OhmStable  <-- rename this
_1OhmStable <-- this is fine

php parse xml - ошибка: StartTag: неверное имя элемента

Хорошая статья:- http://www.xml.com/pub/a/2001/07/25/namingparts.html

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

5 голосов
/ 15 декабря 2011

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

preg_replace("/[^A-Za-z0-9]/", "",$c);

Эта замена не записана для строк в кодировке UTF-8 (которые используются DOMDocument).Вы можете сделать его совместимым с UTF-8 с помощью модификатора u (PCRE8) Документы :

preg_replace("/[^A-Za-z0-9]/u", "",$c);
                            ^

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

1 голос
/ 15 декабря 2011

Даже если __cleandata() удалит все другие символы, кроме латинских алфавитов a-z и цифр, это не обязательно гарантирует, что результатом будет правильное имя XML. Ваша функция может возвращать строки, которые начинаются с цифры, но числа являются недопустимыми именами start символов в XML, они могут появляться только в имени после первого имени. Также пробелы запрещены в именах, так что это еще одна точка, в которой ожидаемый вывод XML потерпит неудачу.

0 голосов
/ 15 декабря 2011

Убедитесь, что сценарии имеют одинаковую кодировку: если это UTF, убедитесь, что в самом начале файла они не имеют метки порядка байтов. Для этого откройте ваш XML-файл с помощью текстового редактора, такого как Notepad ++, и преобразуйте его в «UTF-8 без BOM».

У меня была похожая ошибка, но с файлом json

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...