2011-12-15 2 views
6

Я получаю эту ошибку при выполнении этого кода: 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 PHP ошибка недопустимый символ

Узлы, из исходного файла 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> 
+0

Вы, как разговариваете с самим собой, где находится XML? – ajreal

+0

@ajreal Просто положите его –

+1

Почему вы публикуете чистую версию? – ajreal

ответ

10

Просто вы не можете использовать имя элемента начать с номером

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

php parse xml - error: StartTag: invalid element name

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

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

0

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

У меня была подобная ошибка, но с json file

5

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

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

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

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

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

1

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

Смежные вопросы