【问题标题】:avoid error when xpath does not find namespace in xml避免 xpath 在 xml 中找不到命名空间时出错
【发布时间】:2011-04-13 19:53:33
【问题描述】:

有人能告诉我如何避免这些错误吗? 测试命名空间是否存在?

当我想将地理信息添加到数组时开始 我认为这样做就足够了。

(来自 picasa api 供稿)

foreach($feed->xpath('//gml:pos') as $pos)
{

$feed_arr['geo'][$i]['pos'] = (string)$pos[0];
$i++;
}

<b>Warning</b>:  SimpleXMLElement::xpath() [<a href='/phpmanual/simplexmlelement.xpath'>simplexmlelement.xpath</a>]: Undefined namespace prefix in <b>/home/woonbel/public_html/tsa.nl/applicatie/lib/gpicasa.class.php</b> on line <b>390</b><br />
<br />
<b>Warning</b>:  SimpleXMLElement::xpath() [<a href='/phpmanual/simplexmlelement.xpath'>simplexmlelement.xpath</a>]: xmlXPathEval: evaluation failed in <b>/home/woonbel/public_html/tsa.nl/applicatie/lib/gpicasa.class.php</b> on line <b>390</b><br />
<br />
<b>Warning</b>:  Invalid argument supplied for foreach() in <b>/home/woonbel/public_html/tsa.nl/applicatie/lib/gpicasa.class.php</b> on line <b>390</b><br />

问候,理查德

【问题讨论】:

    标签: php xml namespaces xml-namespaces xpath


    【解决方案1】:

    干净的解决方案是 Wrikken 发布的,但你可以试试这个

    
    foreach( (($tmp = @$feed->xpath('//gml:pos')) ? $tmp : array()) as $pos ) {
        // body
    }
    

    $xml->xpath 用 '@' 调用以抑制错误消息(关于 xpath 的前两个警告),结果分配给 $tmp。然后评估条件语句。 $xml->xpath(...) ? $tmp : 如果 array() 包含有效数据,则返回 $tmp(xpath 查询的结果),否则返回空数组。这将避免针对无效 foreach 参数的警告输出。

    【讨论】:

    • 我在找出哪些条目有命名空间而没有命名空间时遇到了问题?您的解决方案为我提供了三张照片的两个结果,但无法将它们与正确的照片相关联? (实际上有地理数据的)
    • 你能发布 XML 吗?您是生成 XML 还是从外部获取?
    • 我只是使用 simplexml 来检索信息,暂时忘记了 xpath。@Hackstack,有时命名空间元素存在,有时它不在 (atom/xml) 提要中。
    【解决方案2】:

    当它不在$element-&gt;getDocNamespaces();中时不要查询它

    【讨论】:

    • 用strpos还是有更好的建议
    • 呃,你的意思是你只是在应用随机的 XPath 超出你的控制范围吗?如果是这样:捕获错误并且什么也不返回是你唯一的希望,如果不是:只需在整个事情周围添加一个前提条件if(){}
    • 我不明白。你说,用 getDocNa..() 测试。这将返回多个 ns。然后我说,使用 strpos() 找出结果中是否包含 gml 命名空间,然后你说我做事是随机的?需要更多解释。
    • 我的意思是,通常你有或多或少的硬编码 xpath,你不需要任何字符串解析,你已经知道你的下一个 XPath 依赖于什么,您可以检查是否存在正确的数组键。
    • 对不起,我的回复有点晚了,我用简单的 xml 代替了我想要的,原子字段在 getDocSpaces() 中不可见 - 我以为我读过 php 文档! xpath 将是我必须更多练习的东西,在这种情况下我找不到正确的方法。
    猜你喜欢
    • 2017-06-11
    • 1970-01-01
    • 2020-05-13
    • 1970-01-01
    • 2019-05-11
    • 2012-03-29
    • 2012-03-05
    • 2011-08-07
    • 1970-01-01
    相关资源
    最近更新 更多