Я получаю эту ошибку при запуске этого кода: 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>
Просто вы не можете использовать имя элемента start с номером
1OhmStable <-- rename this _1OhmStable <-- this is fine
php parse xml – ошибка: StartTag: недопустимое имя элемента
Хорошая статья: http://www.xml.com/pub/a/2001/07/25/namingparts.html
Имя – это токен, начинающийся с буквы или одного из нескольких символов пунктуации и продолжающийся с буквами, цифрами, дефисами, подчеркиваниями, двоеточиями или полными остановками, также называемыми символами имени.
Вы не указали, где вы получите эту ошибку. Если это после того, как вы очистили значение, это мое предположение:
preg_replace("/[^A-Za-z0-9]/", "",$c);
Эта замена не записывается для кодированных строк UTF-8 (которые используются DOMDocument). Вы можете сделать его совместимым с UTF-8, используя документы u
-modifier (PCRE8) :
preg_replace("/[^A-Za-z0-9]/u", "",$c); ^
Это просто предположение, я предлагаю вам уточнить в своем вопросе, какая часть вашего кода вызывает ошибку.
Даже если __cleandata()
удалит все остальные символы, кроме латинских алфавитов az и цифр, это не обязательно гарантирует, что результат является допустимым XML-именем. Ваша функция может возвращать строки, начинающиеся с числа, но числа являются незаконными именами символов начала в XML, они могут появляться только в имени после первого имени. Кроме того, в именах запрещены пробелы, так что это еще один момент, когда ожидаемый вывод XML завершится неудачно.
Убедитесь, что сценарии имеют одинаковую кодировку: если UTF удостоверится, что они не имеют метки байта (BOM) при самом начале файла. Для этого откройте свой XML-файл с помощью текстового редактора, например Notepad ++, и преобразуйте свой файл в «UTF-8 без спецификации».
У меня была аналогичная ошибка, но с json-файлом