PHP使用简单XML处理XML提要

PHP使用简单XML处理XML提要,php,xml,simplexml,Php,Xml,Simplexml,我正在使用英国气象局api来使用一些天气信息。XML的布局如下所示: <SiteRep> <Wx> <Param name="F" units="C">Feels Like Temperature</Param> <Param name="G" units="mph">Wind Gust</Param> <Param name="H" units="%">Screen Relative

我正在使用英国气象局api来使用一些天气信息。XML的布局如下所示:

<SiteRep>
  <Wx>
    <Param name="F" units="C">Feels Like Temperature</Param>
    <Param name="G" units="mph">Wind Gust</Param>
    <Param name="H" units="%">Screen Relative Humidity</Param>
    <Param name="T" units="C">Temperature</Param>
    <Param name="V" units="">Visibility</Param>
    <Param name="D" units="compass">Wind Direction</Param>
    <Param name="S" units="mph">Wind Speed</Param>
    <Param name="U" units="">Max UV Index</Param>
    <Param name="W" units="">Weather Type</Param>
    <Param name="Pp" units="%">Precipitation Probability</Param>
  </Wx>
<DV dataDate="2013-08-28T08:00:00Z" type="Forecast">
<Location i="22" lat="53.5797" lon="-0.3472" name="HUMBERSIDE AIRPORT" country="ENGLAND" continent="EUROPE">
  <Period type="Day" value="2013-08-28Z">
    <Rep D="SSW" F="19" G="9" H="59" Pp="0" S="4" T="20" V="VG" W="3" U="3">720</Rep> 
  </Period>
</Location>
<Location i="25" lat="53.8658" lon="-1.6606" name="LEEDS BRADFORD INTERNATIONAL AIRPORT" country="ENGLAND" continent="EUROPE">
  <Period type="Day" value="2013-08-28Z">
    <Rep D="SW" F="17" G="11" H="72" Pp="7" S="7" T="18" V="GO" W="7" U="3">720</Rep>
  </Period>
</Location>
</DV>
</SiteRep>

我的问题是我想要的重要数据在Rep中,但在使用simplexml时我似乎无法处理它?我应该用另一种方法来做,还是我遗漏了什么?

试试这个方法来获得
Rep

$xml = simplexml_load_file('file.xml');

foreach($xml->DV->Location as $location)
{
    $att = $location->Period->Rep->attributes();

    echo $att['D'];
    echo $att['F'];
    echo $att['G'];
    echo $att['H'];

    etc...
}

更正您的XML后,我建议使用如下方式:

<?php

$xml = <<<EOF
<SiteRep>
    <Wx>
        <Param name="F" units="C">Feels Like Temperature</Param>
        <Param name="G" units="mph">Wind Gust</Param>
        <Param name="H" units="%">Screen Relative Humidity</Param>
        <Param name="T" units="C">Temperature</Param>
        <Param name="V" units="">Visibility</Param>
        <Param name="D" units="compass">Wind Direction</Param>
        <Param name="S" units="mph">Wind Speed</Param>
        <Param name="U" units="">Max UV Index</Param>
        <Param name="W" units="">Weather Type</Param>
        <Param name="Pp" units="%">Precipitation Probability</Param>
    </Wx>
    <DV dataDate="2013-08-28T08:00:00Z" type="Forecast">
        <Location i="22" lat="53.5797" lon="-0.3472" name="HUMBERSIDE AIRPORT" country="ENGLAND" continent="EUROPE">
            <Period type="Day" value="2013-08-28Z">
                <Rep D="SSW" F="19" G="9" H="59" Pp="0" S="4" T="20" V="VG" W="3" U="3">720</Rep>
            </Period>
        </Location>
        <Location i="25" lat="53.8658" lon="-1.6606" name="LEEDS BRADFORD INTERNATIONAL AIRPORT" country="ENGLAND" continent="EUROPE">
            <Period type="Day" value="2013-08-28Z">
                <Rep D="SW" F="17" G="11" H="72" Pp="7" S="7" T="18" V="GO" W="7" U="3">720</Rep>
            </Period>
        </Location>
    </DV>
</SiteRep>
EOF;

$doc = new DOMDocument();
$doc->loadXML($xml);
$xpath = new DOMXPath($doc);

$query = '//SiteRep/DV/Location/Period/Rep';

$entries = $xpath->query($query);

foreach ($entries as $entry) {
    var_dump($entry->nodeValue);
}

请给我们看一下代码。另外,您试图从上述数据中提取什么?最后缺少了
。我没有复制整个XML提要,因为有5000多个位置,这只是一个样本,然后删除4998个位置,这样XML仍然有效。与HTML不同,XML没有处理无效数据的怪癖模式。现在已编辑但已解决抱歉,我可能不太清楚,它不是rep的值,而是开始rep标记中属性的值。由于XML由英国气象局提供,因此我无需对其进行更正。如果您指的是DV WX和siterep缺少的结束标记,那是因为整个XML提要超过5000个位置。我刚取了一个样本。我将研究DOMNode,因为它是我所关注的rep的属性。非常感谢。
<?php

$xml = <<<EOF
<SiteRep>
    <Wx>
        <Param name="F" units="C">Feels Like Temperature</Param>
        <Param name="G" units="mph">Wind Gust</Param>
        <Param name="H" units="%">Screen Relative Humidity</Param>
        <Param name="T" units="C">Temperature</Param>
        <Param name="V" units="">Visibility</Param>
        <Param name="D" units="compass">Wind Direction</Param>
        <Param name="S" units="mph">Wind Speed</Param>
        <Param name="U" units="">Max UV Index</Param>
        <Param name="W" units="">Weather Type</Param>
        <Param name="Pp" units="%">Precipitation Probability</Param>
    </Wx>
    <DV dataDate="2013-08-28T08:00:00Z" type="Forecast">
        <Location i="22" lat="53.5797" lon="-0.3472" name="HUMBERSIDE AIRPORT" country="ENGLAND" continent="EUROPE">
            <Period type="Day" value="2013-08-28Z">
                <Rep D="SSW" F="19" G="9" H="59" Pp="0" S="4" T="20" V="VG" W="3" U="3">720</Rep>
            </Period>
        </Location>
        <Location i="25" lat="53.8658" lon="-1.6606" name="LEEDS BRADFORD INTERNATIONAL AIRPORT" country="ENGLAND" continent="EUROPE">
            <Period type="Day" value="2013-08-28Z">
                <Rep D="SW" F="17" G="11" H="72" Pp="7" S="7" T="18" V="GO" W="7" U="3">720</Rep>
            </Period>
        </Location>
    </DV>
</SiteRep>
EOF;

$doc = new DOMDocument();
$doc->loadXML($xml);
$xpath = new DOMXPath($doc);

$query = '//SiteRep/DV/Location/Period/Rep';

$entries = $xpath->query($query);

foreach ($entries as $entry) {
    var_dump($entry->nodeValue);
}