Найти первую запись XML и отобразить ее - PullRequest
0 голосов
/ 04 апреля 2020

Я работаю над составлением списка, используя XML и PHP. Я ищу, чтобы найти первый «тег назначения», найденный в RailVehicleStateClass для каждого идентификатора поезда, и вывести его на экран. Я попытался выполнить foreach l oop, чтобы собрать тег назначения, но он просто зацикливает одни и те же данные для каждого идентификатора поезда до конца файла xml. Ниже приведен фрагмент файла XML, полная версия содержит более 700 записей, и каждый поезд может иметь от 1 до 100+ железнодорожных транспортных средств, связанных с ним.

XML

<ScnLoader xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <trainList>
        <TrainLoader>
            <trainID>99991</trainID>
            <TrainWasAI>false</TrainWasAI>
            <DispatchTrainDirection>0</DispatchTrainDirection>
            <ManuallyAppliedSpeedLimitMPH>2147483647</ManuallyAppliedSpeedLimitMPH>
            <PreviousSignalInstruction>Clear</PreviousSignalInstruction>
                <unitLoaderList>
                    <RailVehicleStateClass>
                        <destinationTag>TRC SVMS</destinationTag>
                    </RailVehicleStateClass>
                    <RailVehicleStateClass>
                        <destinationTag>PRC</destinationTag>
                    </RailVehicleStateClass>
            </unitLoaderList>
        </TrainLoader>
    </trainList>
</ScnLoader>

PHP

 <?php
            $trains = simplexml_load_file("Auto%20Save%20World.xml") or die("Error: Cannot create object");   
            $totalUnitCount=0;
            echo "<table>";
                echo "<th>#</th>";
                echo "<th>Train ID</th>";
                echo "<th>Symbol</th>";
                echo "<th>Direction</th>";
                echo "<th>AI</th>";
            foreach ($trains->xpath("//TrainLoader") as $train) {
                $totalUnitCount = $totalUnitCount + 1;

                foreach (array_slice($trains->xpath("//RailVehicleStateClass"),0,1) as $unit){
                    echo $unit->destinationTag;
                }
                echo "</td>";
                echo "<td>";
                echo $train->DispatchTrainDirection;
                echo "</td>";
                echo "<td>";
                echo $train->TrainWasAI;
                echo "</td>";
            }

            ?>

Ответы [ 2 ]

0 голосов
/ 04 апреля 2020

Сначала вам нужно использовать foreach в unitLoaderList, а затем xpath в объекте, который вы создаете из foreach, и добавить . перед // в запросе, чтобы получить только то, что находится внутри объекта.

Я действительно не понимаю, чего вы хотите достичь sh с таблицей HTML, но вот пример кода, который работает с вашим файлом и несколькими поездами без HTML.

        $trains = simplexml_load_file("train.xml") or die("Error: Cannot create object");   
        $totalUnitCount=0;
        foreach ($trains->xpath("//trainList") as $train) {
            $totalUnitCount = $totalUnitCount + 1;
            foreach ($train->xpath(".//unitLoaderList") as $unit){
                foreach ($unit->xpath(".//RailVehicleStateClass") as $railV){
                    echo $railV->destinationTag[0]; //Assuming all RailVehicle has at list one destination tags if not you has to another foreach with xpath of destinationTag and only get the first one
                }
            }
        }
0 голосов
/ 04 апреля 2020

Ваш запрос xpath для получения элементов RailVehicleStateClass должен быть сделан относительно текущего $train. Вы можете сделать это, используя:

$train->xpath(".//RailVehicleStateClass")

Обратите внимание на использование . перед // для создания пути относительно текущего элемента $train.

...