繁体   English   中英

SimpleXMLElement 使用命名空间访问元素?

[英]SimpleXMLElement Access elements with namespace?

我有以下 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);
}

所有你需要的是

$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)

您需要使用->children()方法。 如果您避免使用 XPath 而只使用 SimpleXML 运算符,您的代码最终会简单得多。

在使用标准 PHP 调试函数调试相当神奇的 SimpleXML 对象时,命名空间元素也是许多不可见的事物之一。 (下面使用 [my simplexml_dump()函数代替。)

$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);
}

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

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

我想将返回项解析为一个数组,就像SimpleXMLElement通常在不涉及名称空间时所做的那样。

我今天花了几个小时试图找出为什么simplexml_load_string($xml)拒绝使用我的XML字符串

无论我尝试什么, function 始终返回一个空的object

我没有意识到问题是namespaces

因此,几乎是偶然的(同时无所事事地想知道:字符是否对解析器有问题)我尝试了:

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

有用。

一旦你消除了所有的冒号,突然间,命名空间就不再涉及了

(或者,至少,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. 删除所有命名空间
  2. 将 XML 转换为 Object
  3. 将 Object 转换为 JSON
  4. 替换命名空间
  5. 将 JSON 转换回 Object

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM