0

我收到一个结构如下的旅游 XML 文档:

<msResult timestamp="20130507153907">
    <places>
        <place id="1000008" name="Germany" placePath="1000008"/>
        <place id="1000591" name="Berlin" placePath="10000081000591"/>
    </places>
    <rooms>
        <room id="1002" name="Standard"/>
        <room id="1042" name="Standart"/>
    </rooms>
    <foods>
        <food id="2" name="BB" description="Breakfast"/>
        <food id="1" name="No" description="No food"/>
    </foods>
    <hotels>
        <hotel categoryId="6"/>
        <hotel id="9047" placeId="1000591" name="BERLIN EXCELSIOR" categoryId="8" desc="en"/>
        <hotel id="37803" placeId="1000591" name="MARK APART" categoryId="6" desc="en"/>
     </hotels>
     <routes>
        <route id="223534">
            <point>
                <place placeId="1000591" hotelId="37803" categoryId="6" foodId="1" tourTypeIds="1" roomId="1002"/>
            </point>
         </route>
         <route id="223535">
             <point>
                 <place placeId="1000591" hotelId="9047" categoryId="8" foodId="1" tourTypeIds="1" roomId="1042"/>
             </point>
         </route>
    </routes>
    <tours>
        <group departureId="64" currencyId="2" transportIds="1" includeIds="1 2 32" include="description" exclude="" comment="" program="" transport="">
            <tourGroup duration="3" routeId="223534" statusId="3" tourTypeIds="1" dates="17.05.2013">
                <tour accomId="6" price="850" ids="1339755026"/>
            </tourGroup>
        </group>
        <group departureId="64" currencyId="2" transportIds="1" includeIds="1 2 32" include="descriptiin" exclude="" comment="" program="" transport="">
            <tourGroup duration="3" routeId="223534" statusId="3" tourTypeIds="1" dates="31.05.2013">
                <tour accomId="6" price="902" ids="1339755024"/>
            </tourGroup>
        </group>
        <group departureId="64" currencyId="2" transportIds="1" includeIds="1 2 32" include="description" exclude="" comment="" program="" transport="">
            <tourGroup duration="3" routeId="223535" statusId="3" tourTypeIds="1" dates="17.05.2013">
                <tour accomId="6" price="981" ids="1339755027"/>
            </tourGroup>
        </group>
    </tours>
</msResult>

我需要像这样输出每个游览:

城市名称 | 酒店名称 | 房型 | 食物种类 | 开始日期 | 持续时间 | 价格

我当前的 PHP 代码是这样的:

$xml = simplexml_load_string($out);

foreach ($xml->places->place as $place) {
?>
<h5><?php echo $place["name"]; ?> - 
<?php
}

foreach ($xml->tours->group as $group) {
?>
Date: <?php echo $group->tourGroup["dates"]; ?> - 
Days: <?php echo $group->tourGroup["duration"]; ?> - 
Price: $<?php echo $group->tourGroup->tour["price"];
}

这可行,但不幸的是它只输出单独的 XML 值。

为了正确获得整个结构,我需要将非常量值与相同的值"routeId=xxx"相关联,然后我可以从中获取in并输出from ,然后对 and 执行相同的操作并输出from等。我希望这有点道理。<tourGroup><route id="xxx">"id"<place placeId="xxx">"name"<places><place id="xxx" name="..."><hotelId="xxx">"name"<hotels><hotel id="xxx" name="..."><roomId><foodId>

不幸的是,我无法理解这一点,而且我的 PHP 知识非常基础,但如果有人能指出我正确的方向,我将不胜感激。谢谢!

4

2 回答 2

1

对于初学者来说,请注意,您的 XML 格式不正确因为它缺少结束</msResult>根标记。

XML 远不是您想要的最佳解决方案,我的建议是将这些信息存储在关系数据库中,并从那里使用简单的查询。

尽管如此,我还是编写了一个解决方案只是为了好玩,所以您可以看到 XPath 如何帮助您在节点之间关联数据:

<?php
    $xml = <<<XML
<msResult timestamp="20130507153907">
    <places>
        <place id="1000008" name="Germany" placePath="1000008"/>
        <place id="1000591" name="Berlin" placePath="10000081000591"/>
    </places>
    <rooms>
        <room id="1002" name="Standard"/>
        <room id="1042" name="Standart"/>
    </rooms>
    <foods>
        <food id="2" name="BB" description="Breakfast"/>
        <food id="1" name="No" description="No food"/>
    </foods>
    <hotels>
        <hotel categoryId="6"/>
        <hotel id="9047" placeId="1000591" name="BERLIN EXCELSIOR" categoryId="8" desc="en"/>
        <hotel id="37803" placeId="1000591" name="MARK APART" categoryId="6" desc="en"/>
     </hotels>
     <routes>
        <route id="223534">
            <point>
                <place placeId="1000591" hotelId="37803" categoryId="6" foodId="1" tourTypeIds="1" roomId="1002"/>
            </point>
         </route>
         <route id="223535">
             <point>
                 <place placeId="1000591" hotelId="9047" categoryId="8" foodId="1" tourTypeIds="1" roomId="1042"/>
             </point>
         </route>
    </routes>
    <tours>
        <group departureId="64" currencyId="2" transportIds="1" includeIds="1 2 32" include="description" exclude="" comment="" program="" transport="">
            <tourGroup duration="3" routeId="223534" statusId="3" tourTypeIds="1" dates="17.05.2013">
                <tour accomId="6" price="850" ids="1339755026"/>
            </tourGroup>
        </group>
        <group departureId="64" currencyId="2" transportIds="1" includeIds="1 2 32" include="descriptiin" exclude="" comment="" program="" transport="">
            <tourGroup duration="3" routeId="223534" statusId="3" tourTypeIds="1" dates="31.05.2013">
                <tour accomId="6" price="902" ids="1339755024"/>
            </tourGroup>
        </group>
        <group departureId="64" currencyId="2" transportIds="1" includeIds="1 2 32" include="description" exclude="" comment="" program="" transport="">
            <tourGroup duration="3" routeId="223535" statusId="3" tourTypeIds="1" dates="17.05.2013">
                <tour accomId="6" price="981" ids="1339755027"/>
            </tourGroup>
        </group>
    </tours>
</msResult>
XML;

$sxe = simplexml_load_string($xml);

// Iterate groups
foreach ($sxe->tours->group as $group) {

    // Iterate groups' tours
    foreach ($group->tourGroup as $tourGroup) {
        $routeId = (string) $tourGroup['routeId'];
        $placeId = $sxe->xpath("//route[@id={$routeId}]/point/place/@placeId");
        $placeId = (string) $placeId[0];

        // City name
        $cityName = $sxe->xpath("//place[@id={$placeId}]/@name");
        $cityName = $cityName[0];

        // Hotel name
        $hotelName = $sxe->xpath("//hotel[@id=//route[@id={$routeId}]/point/place/@hotelId]/@name");
        $hotelName = (string) $hotelName[0];

        // Food type
        $foodType = $sxe->xpath("//food[@id=//route[@id={$routeId}]/point/place/@foodId]/@description");
        $foodType = (string) $foodType[0];

        // Room name
        $roomName = $sxe->xpath("//room[@id=//route[@id={$routeId}]/point/place/@roomId]/@name");
        $roomName = (string) $roomName[0];

        $startDate = (string) $tourGroup['dates'];
        $duration  = (string) $tourGroup['duration'];
        $price     = (string) $tourGroup->tour['price'];

        echo "$cityName - $hotelName - $roomName - $foodType - $startDate - $duration - $price\n";
    }
}

输出:

Berlin - MARK APART - Standard - No food - 17.05.2013 - 3 - 850
Berlin - MARK APART - Standard - No food - 31.05.2013 - 3 - 902
Berlin - BERLIN EXCELSIOR - Standart - No food - 17.05.2013 - 3 - 981
于 2013-05-07T23:47:48.297 回答
0

啊。我的第一枪:

$xml = simplexml_load_string($x); // assume XML in $x

// building array $data containing place, room, food, hotel, route
foreach ($xml->places->place as $place)
$data['place'][(string)$place['id']] = (string)$place['name'];

foreach ($xml->rooms->room as $room)
$data['room'][(string)$room['id']] = (string)$room['name'];

foreach ($xml->foods->food as $food)
$data['food'][(string)$food['id']] = (string)$food['name'];

foreach ($xml->hotels->hotel as $hotel)
$data['hotel'][(string)$hotel['id']] = (string)$hotel['name'];

foreach ($xml->routes->route as $route)
    $data['route'][(string)$route['id']] = array(
        'placeId' => (string)$route->point->place['placeId'],
        'hotelId' => (string)$route->point->place['hotelId'],
        'foodId'  => (string)$route->point->place['foodId'],
        'roomId'  => (string)$route->point->place['roomId']);

// looping through <tourGroup> and echoing...
foreach ($xml->tours->group as $g) {
    $rid = (int)$g->tourGroup['routeId'];
    echo $data['place'][$data['route'][$rid]['placeId']] . " | ";
    echo $data['hotel'][$data['route'][$rid]['hotelId']] . " | ";
    echo $data['room'][$data['route'][$rid]['roomId']] . " | ";
    echo $data['food'][$data['route'][$rid]['foodId']] . " | ";
    echo $g->tourGroup['dates'] . " | " . $g->tourGroup['duration'] . " | ";
    echo $g->tourGroup->tour['price'] . "<br />";
}

看到它工作:http ://codepad.viper-7.com/wwgTuE

输出:

Berlin | MARK APART | Standard | No | 17.05.2013 | 3 | 850
Berlin | MARK APART | Standard | No | 31.05.2013 | 3 | 902
Berlin | BERLIN EXCELSIOR | Standart | No | 17.05.2013 | 3 | 981
于 2013-05-08T00:14:46.857 回答