2011-12-15 23 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> 

新しい文書がこのように見えるようになっている:それはUTFだ場合:

<?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

名が文字または1で始まるトークンです文字、数字、ハイフン、アンダースコア、コロン、または完全な停止記号(名前文字として知られています)を続けます。

0

は必ずスクリプトが同じエンコーディングを持っていることを確認しますファイルの先頭にバイトオーダーマーク(BOM)がないことを確認してください。 メモ帳++などのテキストエディタでXMLファイルを開き、ファイルを "BOMなしのUTF-8"に変換します。

私は、同様のエラーを持っていましたが、あなたはそのエラーを取得する場所json file

5

とあなたは書いていません。

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

この置換は、(のDOMDocumentで使用されている)UTF-8エンコードされた文字列のために書かれていません:あなたは値を掃除した後の場合、それはだ、これは私の推測です。あなたはそれがUTF-8 u-modifier (PCRE8)­Docsを使用して、互換性を持たせることができます:それはただの推測だ

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

、私はあなたのコードの一部がエラーをトリガあなたの質問でそれをより正確にする示唆しています。

1

__cleandata()であっても、ラテンアルファベットa-zや数字以外の文字はすべて削除されますが、必ずしも結果が有効なXML名であるとは限りません。あなたの関数は数値で始まる文字列を返すことができますが、数値は不正な名前です文字はXMLで始まり、最初の名前文字の後の名前にしか現れません。また、名前にはスペースを使用できないので、期待されるXML出力が失敗する別のポイントになります。