代码之家  ›  专栏  ›  技术社区  ›  Helen Neely

用php[关闭]分析xml-cdata

  •  5
  • Helen Neely  · 技术社区  · 15 年前

    我有一个小问题,我想不出怎么解决。 我有一个XML(实际上是rss)文件,我正试图用php解析它,但是CDATA标记是空白的。

    这里是 XML 代码 这里是 PHP file

    除了说明标签没有打印外,一切工作正常。 如果有人能帮忙,我将不胜感激。

    1 回复  |  直到 15 年前
        1
  •  16
  •   Pascal MARTIN    15 年前

    只是出于好奇,在得到XML之后 (我希望我没有在这个过程中破坏它——我会看看是否可以编辑操作来更正它) :

    • 你把描述转换成字符串了吗?


    我的意思是你可以用这个:

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

    但这只会让你:

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

    这不是很好…


    您需要将数据强制转换为字符串,如下所示:

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

    你会得到描述:

    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)
    

    (使用) trim 顺便说一句,如果XML是缩进的,那么在上面可能会有用)


    否则…好吧,我们可能需要您的PHP代码(至少,了解您是如何访问 description 标签 ;-) )


    编辑

    感谢重新格式化的XML!

    如果我转到Pastebin,在页面底部的文本区域中,XML的开头有一个空白,在 <?xml version="1.0" encoding="utf-8"?>

    如果在实际的XML数据中有这样一个,那么这将是问题的根源:它不是有效的XML(XML声明必须是 第一 XML数据中的内容)。
    您将得到如下错误:

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

    你能查一下吗?
    如果问题在这里,你应该激活 error_reporting display_errors 那会有帮助的!


    查看PHP文件后编辑:

    在for循环中,您这样做是为了获取描述数据:

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

    我想说,描述不包含任何子节点;直接使用它的nodeValue怎么样?
    这样地:

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

    这样看来效果更好了——)

    作为旁注,我想您也可以对其他标记进行同样的操作;例如,这似乎也起作用:

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

    这给了你什么?


    另一个编辑:下面是我可能使用的代码:

    $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 />';
    }
    

    注意,我有一个字符串中的XML数据,不需要从URL获取它,所以我使用 loadXML 方法而非 load .

    主要的区别是我删除了一些子节点访问,我觉得这是不必要的。
    你觉得这样行吗?