2011-12-15 83 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 2011-12-15 17:27:15

回答

0

确保脚本具有相同的编码:如果是UTF确保它们在文件开始时没有字节顺序标记(BOM)。 为此,请使用Notepad ++等文本编辑器打开XML文件,并将文件转换为“不带BOM的UTF-8”。

我有一个类似的错误,但有json file

5

您还没有写,你得到这个错误。如果这是你清洗后的值,这是我的猜测:

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

这种替换不是为UTF-8编码字符串(通过DOM文档使用)写的。你可以把它UTF-8使用u-modifier (PCRE8)­Docs兼容:

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

这只是一个猜测,我建议你让它在你的问题,你的代码的一部分触发错误更精确。

1

即使__cleandata()将删除除拉丁字母a-z和数字之外的所有其他字符,但不一定保证结果是有效的XML名称。您的函数可以返回以数字开头的字符串,但数字是非法的名字开始字符在XML中,它们只能出现在名字后面的名字中。名称中也禁止使用空格,所以这是预期XML输出失败的另一点。