2010-06-03 34 views
78

Tôi nhận thấy rằng khi sử dụng SimpleXMLElement trên tài liệu có chứa các thẻ CDATA đó, nội dung luôn là NULL. Làm thế nào để sửa lỗi này?PHP: Cách xử lý <! [CDATA [bằng SimpleXMLElement?

Ngoài ra, xin lỗi vì đã gửi spam về XML tại đây. Tôi đã cố gắng để có được một kịch bản dựa trên XML để làm việc trong vài giờ bây giờ ...

<content><![CDATA[Hello, world!]]></content> 

Tôi đã thử các hit đầu tiên trên Google nếu bạn tìm kiếm "cdata SimpleXMLElement", nhưng điều đó không làm việc.

+0

Bạn đang cố truy cập giá trị nút như thế nào? Và, liệu SimpleXML có phải là một yêu cầu không? – allnightgrocery

+0

Tôi đã thử mọi chức năng khác (xml2array và tất cả) mà tôi có thể tìm thấy trên web và SimpleXML có vẻ là chỉ có một kết quả GOOD, ngoại trừ CDATA không hoạt động. – Angelo

+1

Chúng tôi thực hiện rất nhiều phân tích cú pháp XML tại nơi làm việc bằng DOMDocument (http://www.php.net/manual/en/class.domdocument.php). Nó hoạt động tốt trong việc xử lý CDATA. Hãy viết một đoạn mã ngắn hoặc viết thêm một chút để chúng tôi xem bạn đang làm việc với SimpleXML như thế nào. – allnightgrocery

Trả lời

138

Có thể bạn không truy cập chính xác. Bạn có thể xuất trực tiếp hoặc truyền nó dưới dạng chuỗi. (Trong ví dụ này, đúc là không cần thiết, như tiếng vang tự động làm nó anyway)

$content = simplexml_load_string(
    '<content><![CDATA[Hello, world!]]></content>' 
); 
echo (string) $content; 

// or with parent element: 

$foo = simplexml_load_string(
    '<foo><content><![CDATA[Hello, world!]]></content></foo>' 
); 
echo (string) $foo->content; 

Bạn có thể có may mắn hơn với LIBXML_NOCDATA:

$content = simplexml_load_string(
    '<content><![CDATA[Hello, world!]]></content>' 
    , null 
    , LIBXML_NOCDATA 
); 
+2

Không, PHP bỏ qua CDATA hoàn toàn vì một lý do nào đó. Bất kỳ ý tưởng nào khác? – Angelo

+4

Sau đó, đó là một lỗi. Nâng cấp PHP/libxml cho đến khi nó hoạt động (Tôi chưa bao giờ gặp bất kỳ vấn đề nào với CDATA và SimpleXML.) Bạn có thể thử vận ​​may của mình bằng LIBXML_NOCDATA nếu không. –

+0

Bật. Không có LIBXML_NOCDATA, XML xuất hiện dưới dạng false - bất kể nó được thực hiện như thế nào. Tôi có thể chứng minh rằng với cả hai phương pháp tạo ... $ x = new SimpleXMLElement ('', LIBXML_NOCDATA); $ y = simplexml_load_string ('', "SimpleXMLElement", LIBXML_NOCDATA); print_r ($ y); Nếu không có tùy chọn đó, chúng đều là null. Chỉ muốn sao lưu xác nhận của bạn. – allnightgrocery

10

này đã làm các trick cho tôi:

echo trim($entry->title); 
+0

Hoàn hảo nếu bạn cần giữ CData (không có LIBXML_NOCDATA) – maztch

30

LIBXML_NOCDATA là thông số thứ ba tùy chọn của simplexml_load_file() chức năng . Điều này trả về đối tượng XML với tất cả dữ liệu CDATA được chuyển thành chuỗi.

$xml = simplexml_load_file($this->filename, 'SimpleXMLElement', LIBXML_NOCDATA); 
echo "<pre>"; 
print_r($xml); 
echo "</pre>"; 


Fix CDATA in SimpleXML

+0

LIBXML_NOCDATA là những gì tạo ra tác phẩm này cho tôi. PHP 5.3.5 –

+0

Câu trả lời của bạn là câu trả lời giải thích ý nghĩa của ** LIBXML_NOCDATA **! –

4

Đây là hoạt động hoàn hảo cho tôi.

$content = simplexml_load_string(
    $raw_xml 
    , null 
    , LIBXML_NOCDATA 
); 
Các vấn đề liên quan