3

我在解析通过 cURL 加载的 PHP 中的 XML 文档时遇到了这个奇怪的问题。我无法获取包含 URL 地址的 nodeValue(我正在尝试在我的 CMS 中实现简单的 RSS 阅读器)。奇怪的是它适用于每个节点,除了包含 url 地址和日期(和)的节点。

这是代码(我知道这是一个愚蠢的解决方案,但我在使用 DOM 和解析 XML 文档方面还是个新手)。

function file_get_contents_curl($url) {

$ch = curl_init();    // initialize curl handle
curl_setopt($ch, CURLOPT_URL, $url); // set url to post to
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // return into a variable
curl_setopt($ch, CURLOPT_TIMEOUT, 4); // times out after 4s
$result = curl_exec($ch); // run the whole process

return $result;
}

function vypis($adresa) {

$html = file_get_contents_curl($adresa);

$doc = new DOMDocument();
@$doc->loadHTML($html);

$nodes = $doc->getElementsByTagName('title');
$desc = $doc->getElementsByTagName('description');
$ctg = $doc->getElementsByTagName('category');
$pd = $doc->getElementsByTagName('pubDate');
$ab = $doc->getElementsByTagName('link');
$aut = $doc->getElementsByTagName('author');


for ($i = 1; $i < $desc->length; $i++) {

    $dsc = $desc->item($i);
    $titles = $nodes->item($i);
    $categorys = $ctg->item($i);
    $pubDates = $pd->item($i);
    $links = $ab->item($i);
    $autors = $aut->item($i);

    $description = $dsc->nodeValue;
    $title = $titles->nodeValue;
    $category = $categorys->nodeValue;
    $pubDate = $pubDates->nodeValue;
    $link = $links->nodeValue;
    $autor = $autors->nodeValue;

    echo 'Title:' . $title . '<br/>';
    echo 'Description:' . $description . '<br/>';
    echo 'Category:' . $category . '<br/>';
    echo 'Datum ' . gmdate("D, d M Y H:i:s",
       strtotime($pubDate)) . " GMT" . '<br/>';
    echo "Autor: $autor" . '<br/>';
    echo 'Link: ' . $link . '<br/><br/>';
}
}

你能帮我解决这个问题吗?

4

1 回答 1

2

要阅读 RSS,您不应该使用loadHTML,但是loadXML. 链接不显示的一个原因是<link>HTML 中的标记忽略了其内容。另请参阅:http: //www.w3.org/TR/html401/struct/links.html#h-12.3

<item>此外,我发现迭代标签然后迭代它们的子节点更容易。像这样:

$d = new DOMDocument;
// don't show xml warnings
libxml_use_internal_errors(true);
$d->loadXML($xml_contents);
// clear xml warnings buffer
libxml_clear_errors();

$items = array();

// iterate all item tags
foreach ($d->getElementsByTagName('item') as $item) {
    $item_attributes = array();
    // iterate over children
    foreach ($item->childNodes as $child) {
        $item_attributes[$child->nodeName] = $child->nodeValue;
    }
    $items[] = $item_attributes;
}

var_dump($items);
于 2012-05-12T04:54:55.810 回答