【问题标题】:SimpleXML PHP Parsing [duplicate]SimpleXML PHP解析[重复]
【发布时间】:2012-11-01 14:11:24
【问题描述】:

这是重复的,只是不适用于已关闭的问题。 终于找到了答案,即使在这里也是如此。 实际重复:PHP SimpleXML Namespace Problem

编辑:如果您仔细阅读该问题,您会发现它不是 PHP namespace simplexml problems 的重复项。 “可能重复”的答案不是我问题的答案。

再次:
我对$value = $record->children('cap', true)->$title; 没有任何问题。(这是所有“可能重复”的答案)
当带有冒号的标签内有其他标签时,我遇到了问题。

<tag:something>hello</tag:something> //I parse out hello (this is the 'duplicate questions' answer that I don't need answered)

<tag:something>
 <stuff>hello</stuff> //I cannot grab this. Explanation below.
</tag:something>

编辑结束。

原始问题:
我无法在位于 http://alerts.weather.gov/cap/us.php?x=1 的 XML 中获取标签 &lt;value&gt; 内的数据(下面的 XML 示例)。

问题出在:

$array[] = $record-&gt;children($tag_cap, true)-&gt;$tag_geocode-&gt;$tag_value;

这是我唯一无法抓取的数据,我已经验证除了$array[4]之外的所有其他数据都被抓取了。

当父标签的格式为&lt;cap:something&gt; 时,从标签获取数据会出现问题。例如:

当它像&lt;cap:something&gt;100&lt;/cap:something&gt; 时,我可以得到 100。但是如果是&lt;cap:something&gt;&lt;value&gt;100&lt;/value&gt;&lt;/cap:something&gt;,我就不能得到100。

XML 片段:

<?xml version = '1.0' encoding = 'UTF-8' standalone = 'yes'?>

<feed
xmlns = 'http://www.w3.org/2005/Atom'
xmlns:cap = 'urn:oasis:names:tc:emergency:cap:1.1'
xmlns:ha = 'http://www.alerting.net/namespace/index_1.0'
>
<!-- http-date = Tue, 30 Oct 2012 06:34:00 GMT -->

<id>http://alerts.weather.gov/cap/us.atom</id>
<logo>http://alerts.weather.gov/images/xml_logo.gif</logo>
<generator>NWS CAP Server</generator>
<updated>2012-10-30T14:34:00-04:00</updated>
<author>
<name>w-nws.webmaster@noaa.gov</name>
</author>
<title>Current Watches, Warnings and Advisories for the United States Issued by the    National Weather Service</title>
<link href='http://alerts.weather.gov/cap/us.atom'/>

<entry>
<id>http://alerts.weather.gov/cap/wwacapget.php?x=AK124CCADA8120.BlizzardWarning.124CCAE7BFC0AK.AFGWSWNSB.d32adb45b5c82ec5e486c4cfb96d3fb6</id>
<updated>2012-10-30T05:20:00-08:00</updated>
<published>2012-10-30T05:20:00-08:00</published>
<author>
<name>w-nws.webmaster@noaa.gov</name>
</author>
<title>Blizzard Warning issued October 30 at 5:20AM AKDT until October 31 at 6:00AM AKDT by NWS</title>
<link href='http://alerts.weather.gov/cap/wwacapget.php?x=AK124CCADA8120.BlizzardWarning.124CCAE7BFC0AK.AFGWSWNSB.d32adb45b5c82ec5e486c4cfb96d3fb6'/>
<summary>...BLIZZARD WARNING IN EFFECT UNTIL 6 AM AKDT WEDNESDAY... THE NATIONAL WEATHER SERVICE IN FAIRBANKS HAS ISSUED A BLIZZARD WARNING...WHICH IS IN EFFECT UNTIL 6 AM AKDT WEDNESDAY. * VISIBILITY...NEAR ZERO IN SNOW AND BLOWING SNOW. * WINDS...WEST 35 MPH GUSTING TO 50 MPH. * SNOW...ACCUMULATION 3 INCHES THROUGH TONIGHT.</summary>
<cap:event>Blizzard Warning</cap:event>
<cap:effective>2012-10-30T05:20:00-08:00</cap:effective>
<cap:expires>2012-10-30T16:00:00-08:00</cap:expires>
<cap:status>Actual</cap:status>
<cap:msgType>Alert</cap:msgType>
<cap:category>Met</cap:category>
<cap:urgency>Expected</cap:urgency>
<cap:severity>Severe</cap:severity>
<cap:certainty>Likely</cap:certainty>
<cap:areaDesc>Eastern Beaufort Sea Coast</cap:areaDesc>
<cap:polygon></cap:polygon>
<cap:geocode>
<valueName>FIPS6</valueName>
<value>002185</value>
<valueName>UGC</valueName>
<value>AKZ204</value>
</cap:geocode>
<cap:parameter>
<valueName>VTEC</valueName>
<value>/X.NEW.PAFG.BZ.W.0013.121030T1320Z-121031T1400Z/</value>
</cap:parameter>
</entry>

...//rest of XML...

PHP 代码:

ini_set('display_errors','1');

$alert_url = 'http://alerts.weather.gov/cap/us.php?x=1';

$alert_string_xml = file_get_contents($alert_url);

$alert_simple_xml_object = simplexml_load_string($alert_string_xml);

$count = 0;

$tag_entry = 'entry';
$tag_summary = 'summary';
$tag_cap = 'cap';
$tag_event = 'event';
$tag_certainty = 'certainty';
$tag_areaDesc = 'areaDesc';
$tag_geocode = 'geocode';
$tag_value = 'value';

foreach ($alert_simple_xml_object->$tag_entry as $record)
{
    $count++;

    $array = array();
    $array[] = $record->$tag_summary;
    $array[] = $record->children($tag_cap, true)->$tag_event;
    $array[] = $record->children($tag_cap, true)->$tag_certainty;
    $array[] = $record->children($tag_cap, true)->$tag_areaDesc;
    $array[] = $record->children($tag_cap, true)->$tag_geocode->$tag_value;
    //$array[] = $record->children($tag_cap, true)->$tag_geocode->$tag_value[0]; //doesnt work either


    echo $array[4]; //nothing is echoed

}

最新尝试:
我阅读了更多关于命名空间的内容并更好地理解了它们。我什至尝试了我认为更好的解决方案:

//inside the above foreach loop
    $namespaces = $record->getNameSpaces(true);
    $caap = $record->children($namespaces['cap']);
    echo $caap->event; //works (but the first way works too)
    echo $caap->geocode->value; //(STILL does not work. Nothing is echoed)

我不明白为什么我无法从具有包含命名空间的父标签的子标签中获取任何数据。

【问题讨论】:

  • children() 不是 PHP 函数。您不能调用未定义的函数。因此,您的代码被破坏了。请更正它,以便更清楚您的尝试。
  • children 是 SimpleXML 的函数吗?我在问题中添加了一些信息。
  • 是的,这是SimpleXMLElement的方法,见php.net/simplexmlelement.children
  • 这个问题不是重复的。当我想要像 this info 这样的信息时,我可以得到它。但我无法从 内的标签中获取任何信息。如100。我买不到 100。
  • 你是对的,它不是完全重复的。但它也是;) - 我现在添加了一个应该详细解释它的答案:stackoverflow.com/a/13179256/367456 - 在你的早期版本中,这个问题没有发生,因为根元素在它的意义上不“计数”不是子元素,而是根,因此 children 无论如何都不是正确的函数。这就是为什么我写我之前的评论说应该没问题。仔细看后,很明显,如果不是根元素,这是一个问题。详情见答案。

标签: php namespaces simplexml


【解决方案1】:

cap:stuff 是根,因此您可以通过以下方式访问元素:

$xml = simplexml_load_string($your_xml);
$value_name_0 = $xml->valueName[0];
$value_0 = $xml->value[0];
$value_name_1 = $xml->valueName[1];
$value_1 = $xml->value[1];

【讨论】:

  • 抱歉,我的问题中没有足够的信息。我编辑了问题。
  • 无论如何,我的答案中的代码都会做到这一点。
  • 它没有。没有任何回应。
【解决方案2】:

您可能正在寻找this 函数。有2个例子,应该足以解决你的问题

【讨论】:

    【解决方案3】:

    如果您禁用了错误和警告,您面临的问题就不会那么明显:

    命名空间错误:没有定义命名空间前缀上限

    如果您启用错误,您会看到该消息。因为 simplexml 无法正确解析命名空间前缀cap,所以会被丢弃。

    因此你直接访问它:

    $xml->stuff->value[1]
    

    和类似的。考虑以下代码示例 (demo:

    $xml = simplexml_load_string('<entry>
     <cap:stuff>
      <valueName>aaa</valueName>
      <value>000</value>
      <valueName>bbb</valueName>
      <value>111</value>
     </cap:stuff>
    </entry>');
    
    echo "\nResult:", $xml->stuff->value[1], "\n\n";
    echo "XML:\n", $xml->asXML();
    

    它通过输出加载 XML 字符串后演示了错误消息以及 $xml 中的内容:

    Warning: simplexml_load_string(): namespace error : Namespace prefix cap on \ 
                                      stuff is not defined on line 10
    Warning: simplexml_load_string():  <cap:stuff> on line 10
    Warning: simplexml_load_string():            ^ on line 10
    
    Result:111
    
    XML:
    <?xml version="1.0"?>
    <entry>
     <stuff>
      <valueName>aaa</valueName>
      <value>000</value>
      <valueName>bbb</valueName>
      <value>111</value>
     </stuff>
    </entry>
    

    如果您闻到某些东西应该有效但实际上无效,则始终需要仔细观察。一种选择是将字符串作为 XML 再次回显以查看 simplexml 已解析的内容,另一种是启用错误报告并查找警告和错误,它们通常包含更多信息。

    【讨论】:

    • 我有错误,我没有得到那个错误。我将再次更新我的问题,这正是我在做什么。我试图让这个问题更容易理解,但它实际上一定更难回答。
    • 是的,写一个好问题确实不容易。 编辑:对于错误报告,您缺少error_reporting(~0);,因此您可以看到所有警告和通知。
    • 问题精炼。你的回答不起作用。打印echo $alert_simple_xml_object-&gt;asXML(); 时,即使添加error_reporting(~0);,我也没有收到任何错误。当echo $array[4] 时直接访问它不会产生任何结果
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多