2011-12-15 62 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輸出失敗的另一點。