2011-12-15 39 views
6

Tôi nhận được lỗi này khi chạy mã này: 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 nhân vật không hợp lệ lỗi

Các nút mà từ tập tin XML gốc làm chứa các ký tự không hợp lệ, nhưng như tôi đang tước các nhân vật không hợp lệ khỏi nút, các nút sẽ được tạo. Tôi cần phải làm loại mã hóa nào trên tài liệu XML gốc? Tôi có cần giải mã saveXML không?

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); 

Đây là những gì XML gốc trông giống như:

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

Các tài liệu mới được cho là giống như thế này:

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

bạn giống như đang nói chuyện với chính mình, XML ở đâu? – ajreal

+0

@ajreal Chỉ cần đặt nó lên –

+1

Tại sao bạn đăng phiên bản sạch? – ajreal

Trả lời

10

Đơn giản chỉ cần bạn không thể sử dụng một tên phần tử bắt đầu với số

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

php parse xml - error: StartTag: invalid element name

Một bài viết tốt đẹp: - http://www.xml.com/pub/a/2001/07/25/namingparts.html

Một Tên là một sự khởi đầu mã thông báo với một lá thư hoặc một của một vài ký tự dấu chấm câu và tiếp tục với các chữ cái, chữ số, dấu gạch nối, dấu gạch dưới, dấu hai chấm hoặc dấu chấm đầy đủ, cùng nhau được gọi là ký tự tên.

0

Hãy chắc chắn rằng kịch bản có cùng mã hóa: nếu nó là UTF hãy chắc chắn rằng họ không có Dấu hiệu đơn hàng (BOM) lúc bắt đầu tệp. Để thực hiện điều đó, hãy mở tệp XML của bạn bằng trình soạn thảo văn bản như Notepad ++ và chuyển đổi tệp của bạn thành "UTF-8 không có BOM".

Tôi đã có một lỗi tương tự, nhưng với một json file

5

Bạn chưa viết mà bạn nhận được lỗi đó. Trong trường hợp sau khi bạn làm sạch giá trị, đây là dự đoán của tôi:

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

Thay thế này không được viết cho chuỗi được mã hóa UTF-8 (được DOMDocument sử dụng). Bạn có thể làm cho nó UTF-8 tương thích bằng cách sử dụng các u-modifier (PCRE8)­Docs:

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

Nó chỉ là một phỏng đoán, tôi đề nghị bạn thực hiện nó chính xác hơn trong câu hỏi của bạn mà một phần của mã của bạn kích hoạt lỗi.

1

Thậm chí nếu __cleandata() sẽ xóa tất cả các ký tự khác so với chữ cái latin a-z và số, nó không nhất thiết đảm bảo rằng kết quả là một tên XML hợp lệ. Hàm của bạn có thể trả về chuỗi bắt đầu bằng một số nhưng số là tên bất hợp pháp bắt đầu ký tự trong XML, chúng chỉ có thể xuất hiện trong tên sau ký tự đầu tiên. Ngoài ra không gian bị cấm trong tên, do đó, đó là một điểm mà đầu ra XML dự kiến ​​của bạn sẽ thất bại.

Các vấn đề liên quan