我有下面的XML:
<ns1:getBannerLinksResponse xmlns:ns1="http://endpoint.website.com/">
<ns1:return>
<ns1:campaignID>0</ns1:campaignID>
<ns1:categoryID>200230455</ns1:categoryID>
<ns1:categoryName>Promotion</ns1:categoryName>
<ns1:linkID>10001599</ns1:linkID>
<ns1:linkName>KFL-20% off No Min</ns1:linkName>
<ns1:mid>3071</ns1:mid>
<ns1:nid>1</ns1:nid>
<ns1:clickURL>
http://someurl
</ns1:clickURL>
<ns1:endDate>Oct 15, 2012</ns1:endDate>
<ns1:height>250</ns1:height>
<ns1:iconURL>
http://someurl
</ns1:iconURL>
<ns1:imgURL>
http://someurl
</ns1:imgURL>
<ns1:landURL>
http://someurl
</ns1:landURL>
<ns1:serverType>22</ns1:serverType>
<ns1:showURL>
http://someurl
</ns1:showURL>
<ns1:size>13</ns1:size>
<ns1:startDate>Oct 14, 2012</ns1:startDate>
<ns1:width>300</ns1:width>
</ns1:return>
</ns1:getBannerLinksResponse>
我尝试了以下方法,但没有成功:
$data = new SimpleXMLElement($xml);
$data->registerXPathNamespace('ns1','http://endpoint.website.com/');
foreach($data->xpath('//ns1:return') as $banner)
{
$banner->registerXPathNamespace('ns1','http://endpoint.website.com/');
var_dump($banner);
}
4条答案
按热度按时间cld4siwp1#
你只需要
产出
oaxa6hgo2#
您需要使用
->children()
方法,如果您避免使用XPath而只使用SimpleXML操作符,您的代码最终会简单得多。在使用标准PHP调试函数调试相当神奇的SimpleXML对象时,命名空间元素也是许多不可见的东西之一(下面使用[my
simplexml_dump()
function代替)。请注意,“ns1”命名空间保持选中状态,直到另一个
->children()
调用:如果
<return>
可以出现多次,则显然变为:icomxhvb3#
如果有人感兴趣的话这就是我的工作方式
mo49yndu4#
我想把返回项解析成一个数组,就像
SimpleXMLElement
在不涉及名称空间时通常做的那样。今天我花了几个小时试图找出
simplexml_load_string($xml)
拒绝使用我的XML
字符串的原因无论我尝试什么,该函数始终返回空的
object
。我没有意识到问题是名称空间。
因此,我几乎是偶然地(在无所事事地想
:
字符是否对解析器有问题时)试验了:它起作用了。
一旦您删除了所有冒号,突然之间,* 名称空间就不再涉及 *。
(Or至少,XML解析器 * 识别 * 为名称空间的内容--因为 * 我们 * 知道
____
仍然表示名称空间。)因此,您可以运行以下命令:
这将:
1.删除所有名称空间
1.将XML转换为对象
1.将对象转换为JSON
1.替换名称空间
1.将JSON转换回Object