php SimpleXMLElement访问带有名称空间的元素?

xienkqul  于 2023-01-29  发布在  PHP
关注(0)|答案(4)|浏览(128)

我有下面的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);
}
cld4siwp

cld4siwp1#

你只需要

$data = new SimpleXMLElement($xml);
$data->registerXPathNamespace('ns1','http://endpoint.websitecom/');
$part = $data->xpath("//ns1:return");
var_dump($part[0]->children("ns1",true));

产出

object(SimpleXMLElement)[3]
  public 'campaignID' => string '0' (length=1)
  public 'categoryID' => string '200230455' (length=9)
  public 'categoryName' => string 'Promotion' (length=9)
  public 'linkID' => string '10001599' (length=8)
  public 'linkName' => string 'KFL-20% off No Min' (length=18)
  public 'mid' => string '3071' (length=4)
  public 'nid' => string '1' (length=1)
  public 'clickURL' => string '
            http://someurl
        ' (length=36)
  public 'endDate' => string 'Oct 15, 2012' (length=12)
  public 'height' => string '250' (length=3)
  public 'iconURL' => string '
            http://someurl
        ' (length=36)
  public 'imgURL' => string '
            http://someurl
        ' (length=36)
  public 'landURL' => string '
            http://someurl
        ' (length=36)
  public 'serverType' => string '22' (length=2)
  public 'showURL' => string '
            http://someurl
        ' (length=36)
  public 'size' => string '13' (length=2)
  public 'startDate' => string 'Oct 14, 2012' (length=12)
  public 'width' => string '300' (length=3)
oaxa6hgo

oaxa6hgo2#

您需要使用->children()方法,如果您避免使用XPath而只使用SimpleXML操作符,您的代码最终会简单得多。
在使用标准PHP调试函数调试相当神奇的SimpleXML对象时,命名空间元素也是许多不可见的东西之一(下面使用[my simplexml_dump() function代替)。

$data = new SimpleXMLElement($xml);
$banner = $data->children('ns1', true)->return; 
// Or to avoid relying on the 'ns1' alias: ->children('http://endpoint.website.com/', false);
simplexml_dump($banner);

请注意,“ns1”命名空间保持选中状态,直到另一个->children()调用:

// Remember to cast to string if you want the content of an element or attribute
var_dump( (string)$banner->linkName );

如果<return>可以出现多次,则显然变为:

foreach ( $data->children('ns1', true)->return as $banner )
{
    simplexml_dump($banner);
}
icomxhvb

icomxhvb3#

如果有人感兴趣的话这就是我的工作方式

$xml = simplexml_load_string($response);
$nameSpaces = $xml->getNamespaces(true);
foreach ($nameSpaces as $prefix => $nameSpace) {
    $xml->registerXPathNamespace($prefix, $nameSpace);
}
$results = $xml->xpath('//NameSpace:Element');
mo49yndu

mo49yndu4#

我想把返回项解析成一个数组,就像SimpleXMLElement在不涉及名称空间时通常做的那样。
今天我花了几个小时试图找出simplexml_load_string($xml)拒绝使用我的XML字符串的原因
无论我尝试什么,该函数始终返回空的object
我没有意识到问题是名称空间
因此,我几乎是偶然地(在无所事事地想:字符是否对解析器有问题时)试验了:

$xml = str_replace(':', '____');

它起作用了。
一旦您删除了所有冒号,突然之间,* 名称空间就不再涉及 *。
(Or至少,XML解析器 * 识别 * 为名称空间的内容--因为 * 我们 * 知道____仍然表示名称空间。)
因此,您可以运行以下命令:

$xml_String = str_replace(':', '____', $xml_String);
$xml_Object = simplexml_load_string($xml_String);
$xml_JSON = json_encode($xml_Object);
$xml_JSON = str_replace('____', ':', $xml_JSON);
$xml_Object = json_decode($XML_SOAP_Response_JSON, TRUE);

echo print_r($xml_Object);

这将:
1.删除所有名称空间
1.将XML转换为对象
1.将对象转换为JSON
1.替换名称空间
1.将JSON转换回Object

相关问题