2009-08-07 41 views
5

Tôi có một vấn đề nhỏ mà tôi không thể tìm ra cách giải quyết. Tôi có một tệp XML (thực sự là RSS) mà tôi đang cố gắng phân tích cú pháp với PHP, nhưng thẻ CDATA bị trống.Phân tích cú pháp XML CDATA bằng PHP

Dưới đây là Bộ luật XML và đây là PHP file

Tất cả mọi thứ hoạt động tốt, ngoại trừ các thẻ mô tả không phải là in ấn. Tôi sẽ rất biết ơn nếu một số người có thể giúp đỡ.

+1

Bạn cũng có thể đăng phần mã phụ trách phân tích cú pháp dữ liệu XML không? Có thể lỗi trong mã và không có trong dữ liệu ^^ –

+2

Bạn vẫn có mã XML và PHP phải không? Pastebin đã xóa các mục nhập của bạn. Nếu bạn có chúng, bạn có thể chỉnh sửa câu hỏi để đưa chúng trở lại (không đặt chúng trở lại trên pastebin, đặt chúng vào văn bản câu hỏi thay thế.) Nếu bạn không thể, câu hỏi sẽ bị xóa. Cảm ơn. –

+0

id dán không xác định! – GoodSp33d

Trả lời

16

Chỉ vì tò mò, sau khi nhận được XML của bạn (Tôi hy vọng tôi didnt't tiêu diệt nó trong quá trình này - Tôi sẽ xem liệu tôi có thể chỉnh sửa các OP để sửa chữa nó):

  • bạn có đưa mô tả vào chuỗi không?


Những gì tôi có nghĩa là bạn có thể sử dụng này:

$xml = simplexml_load_string($str); 
foreach ($xml->channel->item as $item) { 
    var_dump($item->description); 
} 

Nhưng nó sẽ chỉ giúp bạn rằng:

object(SimpleXMLElement)[5] 
object(SimpleXMLElement)[3] 

Mà không phải là đẹp ...


Bạn cần truyền dữ liệu vào chuỗi, như sau:

$xml = simplexml_load_string($str); 
foreach ($xml->channel->item as $item) { 
    var_dump((string)$item->description); 
} 

Và bạn sẽ có được giới thiệu:

string ' 

This is one of the content that I need printed on the screen, but nothing is happening. Please, please...output something... <br /><br /> <b>Showing</b>: 2 weeks<br /> <b>Starting On</b>: August 7, 2009 <br /> <b>Posted On</b>: August 7, 2009 <br /> 
<a href="http://www.mysite.com">click to view</a> 
      ' (length=329) 

string ' 

Another content...This is another of the content that I need printed on the screen, but nothing is happening. Please, please...output something... <br /><br /> <b>Showing</b>: 2 weeks<br /> Starting On: August 7, 2009 <br /> <b>Posted On</b>: August 7, 2009 
; 
       ' (length=303) 

(Sử dụng trim về những người có thể chứng minh hữu ích, btw, nếu bạn XML là thụt vào)


khác ... Vâng , có lẽ chúng tôi sẽ cần mã php của bạn (ít nhất, sẽ hữu ích khi biết cách bạn nhận được thẻ description;-))


EDIT

Cảm ơn XML định dạng lại!

Nếu tôi đi đến Pastebin, trong textarea ở dưới cùng của trang, có một khoảng trắng ở đầu XML, trước khi <?xml version="1.0" encoding="utf-8"?>

Nếu bạn đã là một trong dữ liệu XML thực sự của bạn, nó sẽ là một nguồn của vấn đề: nó không phải là hợp lệ XMl (khai báo XML phải là điều đầu tiên trong dữ liệu XML).
Bạn sẽ nhận được lỗi như thế này một:

Warning: simplexml_load_string() [function.simplexml-load-string]: Entity: line 1: parser error : XML declaration allowed only at the start of the document 

Bạn có thể kiểm tra xem?
Và nếu vấn đề ở đây, bạn nên kích hoạt error_reportingdisplay_errors ;-) Điều đó sẽ hữu ích!


EDIT sau khi xem xét các file PHP:

Trong bạn cho vòng lặp, bạn đang làm điều này để có được dữ liệu mô tả của bạn:

$item_desc = $x->item($i)->getElementsByTagName('description')->item(0)->childNodes->item(0)->nodeValue; 

mô tả không chứa bất kỳ childNode , Tôi sẽ nói ; những gì về việc sử dụng nó nodeValue trực tiếp?
Như thế này:

$item_desc = $x->item($i)->getElementsByTagName('description')->item(0)->nodeValue; 

Có vẻ như được làm việc tốt hơn theo cách này :-)

Là một sidenote, bạn có thể có thể làm tương tự cho các thẻ khác, Tôi cho rằng; ví dụ: điều này dường như cũng đang hoạt động:

$item_title=$x->item($i)->getElementsByTagName('title')->item(0)->nodeValue; 
$item_link=$x->item($i)->getElementsByTagName('link')->item(0)->nodeValue; 

Điều này cung cấp gì cho bạn?


EDIT Một: và đây là đoạn code tôi có lẽ sẽ sử dụng:

$xmlDoc = new DOMDocument(); 
$xmlDoc->loadXML($str);   // I changed that because I have the XML data in a string 

//get elements from "<channel>" 
$channel = $xmlDoc->getElementsByTagName('channel')->item(0); 
$channel_title = $channel->getElementsByTagName('title')->item(0)->nodeValue; 
$channel_link = $channel->getElementsByTagName('link')->item(0)->nodeValue; 
$channel_desc = $channel->getElementsByTagName('description')->item(0)->nodeValue; 

//output elements from "<channel>" 
echo "<p><a href='" . $channel_link . "'>" . $channel_title . "</a>"; 
echo "<br />"; 
echo $channel_desc . "</p>"; 

//get and output "<item>" elements 
$x = $xmlDoc->getElementsByTagName('item'); 
for ($i=0 ; $i<=1 ; $i++) { 
    $item_title = $x->item($i)->getElementsByTagName('title')->item(0)->nodeValue; 
    $item_link = $x->item($i)->getElementsByTagName('link')->item(0)->nodeValue; 
    $item_desc = $x->item($i)->getElementsByTagName('description')->item(0)->nodeValue; 
    echo ("<p><a href='" . $item_link 
    . "'>" . $item_title . "</a>"); 
    echo ("<br />"); 
    echo ($item_desc . "</p>"); 
    echo' <p />'; 
} 

Note Tôi có dữ liệu XML trong một chuỗi, và tôi không cần phải lấy nó từ một URL, vì vậy tôi đang sử dụng phương pháp loadXML chứ không phải load.

Sự khác biệt lớn nhất là tôi đã xóa một số quyền truy cập của trẻ em mà tôi cảm thấy không cần thiết.
Điều này có vẻ ổn với bạn không?

+0

Không có không gian trống ... Tôi đoán nó từ phía bạn. Khai báo XML nằm trên hàng đầu tiên. –

+0

Có thể là một vấn đề với Pastebin, hoặc, như bạn nói, về phía tôi; Tôi đã gỡ bỏ nó và nó OK ngay bây giờ - Tôi đã chỉnh sửa câu trả lời của tôi khá nhiều lần (sau khi bạn đưa ra XML, và sau đó, sau khi bạn đã cung cấp mã PHP, và một lần khác cho một giải pháp "cuối cùng"), cung cấp thêm thông tin; hi vọng điêu nay co ich ! –

+0

Cảm ơn Pascal vì sự giúp đỡ của bạn, nhưng bạn đã nhận được $ str bạn đang tải 'loadXML ($ str) ở đâu? Bạn có thể cho biết cách thay đổi mã của mình để tải chuỗi không? –

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