PHP SimpleXMLElements::xpath()不能在不同的XML结构中找到值细节


PHP SimpleXMLElements::xpath() not find valu detail in different XML structure

我的问题是,我有一个XML内容。我读它与PHP SimpleXMLElements()类。XML看起来像这样:

<search_result>
<movies>
     <movie>
        <title>Rambo 1</title>
     </movie>
     <movie>
        <title>Terminator 1</title>
     </movie>
     <movie>
        <title>Romeo and Juliett</title>
     </movie>
</movies>
<program>
    <item>
        <id>5405059</id>
        <show_date>03.22.</show_date>
        <show_time>14:30</show_time>
        <rfcdate>Fri, 22 Mar 2013 14:30:00 +0100</rfcdate>
        <title>Doku-cinema</title>
        <genre/>
        <channel_name>d1 Tv</channel_name>
        <channel_id>232</channel_id>
    </item>
    <item>
        <id>5405059</id>
        <show_date>03.22.</show_date>
        <show_time>14:30</show_time>
        <rfcdate>Fri, 22 Mar 2013 14:30:00 +0100</rfcdate>
        <title>Romantic-Romeo and Juliett</title>
        <genre/>
        <channel_name>d1 Tv</channel_name>
        <channel_id>232</channel_id>
    </item>
    <item>
        <id>5405059</id>
        <show_date>03.22.</show_date>
        <show_time>14:30</show_time>
        <rfcdate>Fri, 22 Mar 2013 14:30:00 +0100</rfcdate>
        <title>Doku-cinema</title>
        <genre/>
        <channel_name>d1 Tv</channel_name>
        <channel_id>232</channel_id>
    </item>
</program>

我想找到包含示例'Rome'的所有节点,并仅返回节点。我的意思是……例子:

$xml = simplexml_load_file("moviecinemas.xml");
$searchNodes = $xml->xpath('//*[contains(.,'Romeo')]');

我想要这样的结构:

<item>
<id>5405059</id>
<show_date>03.22.</show_date>
<show_time>14:30</show_time>
<rfcdate>Fri, 22 Mar 2013 14:30:00 +0100</rfcdate>
<title>Romantic-Romeo and Juliett</title>
<genre/>
<channel_name>d1 Tv</channel_name>
<channel_id>232</channel_id>
</item>
<movie>
<title>Romeo and Juliett</title>
</movie>

在我看来,您只是遇到了一点XPath问题。顺便说一句,在你的问题示例XML是畸形的,它没有search_result节点关闭标记。

下面是一个工作示例:

<?php
$xml = <<<XML
<search_result>
    <movies>
        <movie>
            <title>Rambo 1</title>
         </movie>
         <movie>
            <title>Terminator 1</title>
         </movie>
         <movie>
            <title>Romeo and Juliett</title>
         </movie>
    </movies>
    <program>
        <item>
            <id>5405059</id>
            <show_date>03.22.</show_date>
            <show_time>14:30</show_time>
            <rfcdate>Fri, 22 Mar 2013 14:30:00 +0100</rfcdate>
            <title>Doku-cinema</title>
            <genre/>
            <channel_name>d1 Tv</channel_name>
            <channel_id>232</channel_id>
        </item>
        <item>
            <id>5405059</id>
            <show_date>03.22.</show_date>
            <show_time>14:30</show_time>
            <rfcdate>Fri, 22 Mar 2013 14:30:00 +0100</rfcdate>
            <title>Romantic-Romeo and Juliett</title>
            <genre/>
            <channel_name>d1 Tv</channel_name>
            <channel_id>232</channel_id>
        </item>
        <item>
            <id>5405059</id>
            <show_date>03.22.</show_date>
            <show_time>14:30</show_time>
            <rfcdate>Fri, 22 Mar 2013 14:30:00 +0100</rfcdate>
            <title>Doku-cinema</title>
            <genre/>
            <channel_name>d1 Tv</channel_name>
            <channel_id>232</channel_id>
        </item>
    </program>
</search_result>
XML;
$sxe        = new SimpleXMLElement($xml);
$romeoItems = $sxe->xpath('//program/item[contains(./title, "Romeo")]');
print_r($romeoItems);
输出:

Array
(
    [0] => SimpleXMLElement Object
        (
            [id] => 5405059
            [show_date] => 03.22.
            [show_time] => 14:30
            [rfcdate] => Fri, 22 Mar 2013 14:30:00 +0100
            [title] => Romantic-Romeo and Juliett
            [genre] => SimpleXMLElement Object
                (
                )
            [channel_name] => d1 Tv
            [channel_id] => 232
        )
)