PHP将分隔的文本文件转换为XML

时间:2014-10-27 03:10:13

标签: php xml

我需要一些帮助,使用PHP将分隔的文本文件转换为可用的XML文件。

文本文件本身由数百个机场及其受人尊敬的跑道组成;这是一个小样本:

AP;KLAX;LOS ANGELES INTL;33.942495;-118.408070
RW;06L;33.949109;-118.431156
RW;06R;33.946853;-118.434239
RW;07L;33.935825;-118.419336
RW;07R;33.933645;-118.419014
RW;24L;33.950189;-118.401664
RW;24R;33.952100;-118.401945
RW;25L;33.937359;-118.382708
RW;25R;33.939553;-118.382906
AP;KSFO;SAN FRANCISCO INTL;37.618817;-122.375428
RW;01L;37.609453;-122.381897
RW;01R;37.607689;-122.380139
RW;10L;37.628739;-122.393392
RW;10R;37.626289;-122.393106
RW;19L;37.627342;-122.367111
RW;19R;37.626481;-122.370608
RW;28L;37.612095;-122.359264
RW;28R;37.613917;-122.358056

基本上,我需要按以下格式将其解析为可用的XML文件:

<Airports>
    <Airport ID="KLAX" Name="LOS ANGELES INTL">
        <Location Lat="33.942495" Lon="-118.408070" />
        <Runways>
            <Runway>06L</Runway>
            <Runway>06R</Runway>
            <Runway>07L</Runway>
            <Runway>07R</Runway>
            <Runway>24L</Runway>
            <Runway>24R</Runway>
            <Runway>25L</Runway>
            <Runway>25R</Runway>
        </Runways>
    </Airport>
    <Airport ID="KSFO" Name="SAN FRANCISCO INTL">
        <Location Lat="37.618817" Lon="-122.375428" />
        <Runways>
            <Runway>01L</Runway>
            <Runway>01R</Runway>
            <Runway>10L</Runway>
            <Runway>10R</Runway>
            <Runway>19L</Runway>
            <Runway>19R</Runway>
            <Runway>28L</Runway>
            <Runway>28R</Runway>
        </Runways>
    </Airport>
</Airports>

这是我使用的PHP代码:

$fp = fopen('data.dat', 'r');

$xml = new XMLWriter;
$xml->openURI('php://output');
$xml->setIndent(true);
$xml->startElement('Airports');

while ($line = fgetcsv($fp, 0, ';'))
{
    if ($line[0] == 'AP')
    {
        $xml->startElement('Airport');
        $xml->writeAttribute('ID', $line[1]);
        $xml->writeAttribute('Name', trim($line[2]));

        // Location
        $xml->startElement('Location');
        $xml->writeAttribute('Lat', $line[3]);
        $xml->writeAttribute('Lon', $line[4]);
        $xml->endElement();

        $xml->startElement('Runways');
    }

    if($line[0] == 'RW')
    {
        $xml->startElement('Runway', $line[1]);
        $xml->endElement();
    }

    if($line[0] == 'AP')
    {
        $xml->endElement();
        $xml->endElement();
    }
}
$xml->endElement();

但这就是正在创造的东西:

<Airports>
 <Airport ID="KLAX" Name="LOS ANGELES INTL">
  <Location Lat="33.942495" Lon="-118.408070"/>
  <Runways/>
 </Airport>
</Airports>
<Airport ID="KSFO" Name="SAN FRANCISCO INTL">
 <Location Lat="37.618817" Lon="-122.375428"/>
 <Runways/>
</Airport>

有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:1)

startElement只需要一个参数,在这种情况下您可能需要WriteElement 你的机场和跑道的终端元素还有点偏离

$first = true;
while ($line = fgetcsv($fp, 0, ';'))
{
    if ($line[0] == 'AP')
    {
        if (!first){
        // close the runway and airport tags
            $xml->endElement();
            $xml->endElement();
        }
        $xml->startElement('Airport');
        $xml->writeAttribute('ID', $line[1]);
        $xml->writeAttribute('Name', trim($line[2]));

        // Location
        $xml->startElement('Location');
        $xml->writeAttribute('Lat', $line[3]);
        $xml->writeAttribute('Lon', $line[4]);
        $xml->endElement();

        $xml->startElement('Runways');
        $first = false;
    }

    if($line[0] == 'RW')
    {
        $xml->writeElement('Runway', $line[1]);
    }
}
// close all open tags
while ($xml->endElement() !== false) { continue; }