如何使用PHP从嵌套的xml节点检索数据?

时间:2014-07-31 18:29:57

标签: php xml

我是xml和数据检索的新手,我对此代码有疑问。

XML代码:

<?xml version="1.0" encoding="UTF-8"?>
<site>
    <page>
        <content>
            <P>
                <FONT size="2" face="Tahoma">
                    <STRONG>text...</STRONG>
                </FONT>
            </P>
            <P>
                <FONT size="2" face="Tahoma">text....</FONT>
            </P>

            <P align="center">
                <IMG style="WIDTH: 530px" border="1" alt="" src="http://www.alkul.com/online/2014/5/6/child%20disorder.jpg">
            </P>
            <P>
                <STRONG>
                    <FONT size="2" face="Tahoma">text3</FONT>
                </STRONG>
            </P>
            <P>
                <STRONG>
                    <FONT size="2" face="Tahoma">text1</FONT>
                </STRONG>
            </P>
        </content>
    </page>
</site>

php代码:

<?php
$html = "";
$url  = "Data.xml";
$xml  = simplexml_load_file($url);    

for ($i = 0; $i<10; $i++) {     
    $title = $xml->page[$i]->content->P->FONT;
    $html .= "<p>$title</p>";
}

echo $html;

我只需要显示内容节点的内容,但输出为空

3 个答案:

答案 0 :(得分:2)

首先,提供的XML无效,因为您应该收到以下错误:

  

警告:simplexml_load_string():实体:第8行:解析器错误:打开和结束标记不匹配:IMG第8行和第P

在XML中,IMG元素需要像这样关闭:

<IMG style="WIDTH: 530px" border="1" alt="" src="http://www.alkul.com/online/2014/5/6/child%20disorder.jpg"/>

注意元素末尾的正斜杠 如果您没有看到该错误,请查看错误日志或在PHP中启用错误报告。

现在可以通过SimpleXML解析XML。我最终得到了这个:

$pList = $xml->xpath('./page/content/P');
foreach ($pList as $pElement) {
    $text = strip_tags($pElement->asXML());
    echo $text . "<br>";
}

它将所有P元素选择为$pList并迭代列表。对于每个元素,它采用XML并从中删除所有标记,只留下&#34;内部文本&#34;对于每个元素。

最后,我建议您使用PHP Simple HTML DOM Parser,因为它非常易于使用,并且更适合从HTML中抓取数据。

答案 1 :(得分:1)

如果您只想显示内容节点中的内容,那么这里是您的代码

<?php
$html = "";
$url  = "data.xml";
$xml  = simplexml_load_file($url);

$title = $xml->page->content->asXML();
$html  .= "<p>$title</p>";

echo $html;

答案 2 :(得分:0)

您在XML节点中有HTML。这需要XML编码,通常使用CDATA块完成。然后,您可以将$xml->page->content元素与echo一起使用,或者将其强制转换为字符串。

XML(记下<![CDATA[ ... ]]>部分):

<?xml version="1.0" encoding="UTF-8"?>
<site>
    <page>
        <content><![CDATA[
            <P>
                <FONT size="2" face="Tahoma">
                    <STRONG>text...</STRONG>
                </FONT>
            </P>
            <P>
                <FONT size="2" face="Tahoma">text....</FONT>
            </P>

            <P align="center">
                <IMG style="WIDTH: 530px" border="1" alt="" src="http://www.alkul.com/online/2014/5/6/child%20disorder.jpg">
            </P>
            <P>
                <STRONG>
                    <FONT size="2" face="Tahoma">text3</FONT>
                </STRONG>
            </P>
            <P>
                <STRONG>
                    <FONT size="2" face="Tahoma">text1</FONT>
                </STRONG>
            </P>
        ]]></content>
    </page>
</site>

PHP:

$xml = simplexml_load_file($url);

$firstTenPages = new LimitIterator(new IteratorIterator($xml->page), 0, 10);

foreach ($firstTenPages as $page)
{
    echo $page->content;
}