0

我有一个 file.txt,其中包含以下内容:

[General]
FileVersion=3
NumberOfWaypoints=12
[Point1]
Latitude=50.8799722
Longitude=4.7008664
Radius=10
Altitude=25
ClimbRate=30
DelayTime=2
WP_Event_Channel_Value=100
Heading=0
Speed=30
CAM-Nick=0
Type=1
Prefix=P
[Point2]
...

我想从中提取数据,以便稍后将其解析为 xml 文件或数据库。

我试过使用像 substr 和 strrpos 这样的 php 函数,但我总是遇到麻烦,因为像高度和爬升率这样的值的长度可能是“20”或“2”或“200”。同样当使用 strrpos 并且“needle”的值出现多次时;我没有得到正确的价值。

以前有人遇到过这种类型的问题吗?

(编辑:我将文件加载到 php 字符串中)

4

2 回答 2

2

你可以试试这个:

<?php
$array = parse_ini_string($string);

$xml = new SimpleXMLElement('<root/>');
array_walk_recursive($array, array ($xml, 'addChild'));
echo $xml->asXML();
?>
于 2012-11-04T15:07:40.880 回答
1

或者你可以试试这个:

<?php
//or create $file from file_get_contents('file.txt');
$file = "[General]
FileVersion=3
NumberOfWaypoints=12
[Point1]
Latitude=50.8799722
Longitude=4.7008664
Radius=10
Altitude=25
ClimbRate=30
DelayTime=2
WP_Event_Channel_Value=100
Heading=0
Speed=30
CAM-Nick=0
Type=1
Prefix=P
[Point2]";

//or create $array with file('file.txt');
$array = explode("\n",$file);

//Create and output xml from the given array
header('Content-Type: text/xml');
$xml = new SimpleXMLElement('<?xml version="1.0" encoding="UTF-8"?><points/>');

foreach($array as $k=>$v){
    if(substr($v,0,1)=='['){
        $node = $xml->addChild(str_replace(array('[',']'),'',$v));
    }else{
        list($key,$value) = explode('=',$v,2);
        $node->addChild($key, trim($value));
    }
}

//DOMDocument to format code output
$dom = new DOMDocument('1.0');
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;
$dom->loadXML($xml->asXML());

echo $dom->saveXML();

/*Result:
<?xml version="1.0" encoding="UTF-8"?>
<points>
  <General>
    <FileVersion>3</FileVersion>
    <NumberOfWaypoints>12</NumberOfWaypoints>
  </General>
  <Point1>
    <Latitude>50.8799722</Latitude>
    <Longitude>4.7008664</Longitude>
    <Radius>10</Radius>
    <Altitude>25</Altitude>
    <ClimbRate>30</ClimbRate>
    <DelayTime>2</DelayTime>
    <WP_Event_Channel_Value>100</WP_Event_Channel_Value>
    <Heading>0</Heading>
    <Speed>30</Speed>
    <CAM-Nick>0</CAM-Nick>
    <Type>1</Type>
    <Prefix>P</Prefix>
  </Point1>
  <Point2/>
</points>
*/
于 2012-11-04T15:13:30.300 回答