2017-10-09 83 views
0

我试图在xml表中找到一些数据。产品和产品命名空间打破了我的xpath

我可以从XML得到的数据,如果其中除去这样的命名空间:

$nodes = $data->xpath('//Products/Product/productId[.='.$sku.']/parent::*'); 

但是当我下载真正的XML作为与该产品命名空间和命名空间的下方看到它被格式化产品

XML:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><Products xmlns="http://config.services.bol.com/schemas/product-feed-1.1.xsd"> 
<Product xmlns="http://config.services.bol.com/schemas/product-1.1.xsd"><productId>9200000082000054</productId><ean>8719659945854</ean><title>SULADA Glossy TPU Bescherm Telefoon Hoesje Samsung Galaxy S8 - Rood</title><productUrlNL>https://www.bol.com/nl/p/sulada-glossy-tpu-bescherm-telefoon-hoesje-samsung-galaxy-s8-rood/9200000082000054/</productUrlNL><productUrlBE>https://www.bol.com/be/p/sulada-glossy-tpu-bescherm-telefoon-hoesje-samsung-galaxy-s8-rood/9200000082000054/</productUrlBE><imageUrl>https://s.s-bol.com/imgbase0/imagebase3/large/FC/4/5/0/0/9200000082000054.jpg</imageUrl><mpn>SS800003374</mpn><brand>GEEN</brand><familyName>SULADA Glossy TPU Bescherm Telefoon Hoesje Samsung Galaxy S8 - Rood</familyName><OfferNL><sellingPrice>14.95</sellingPrice><shippingCost>0.00</shippingCost><condition>new</condition><isDeliverable>true</isDeliverable><ultimateOrderTime>23:59:00.000+02:00</ultimateOrderTime><maximalDeliveryDay>12</maximalDeliveryDay><sellerType>P</sellerType></OfferNL><OfferBE><sellingPrice>14.95</sellingPrice><shippingCost>0.00</shippingCost><condition>new</condition><isDeliverable>true</isDeliverable><ultimateOrderTime>23:59:00.000+02:00</ultimateOrderTime><maximalDeliveryDay>12</maximalDeliveryDay><sellerType>P</sellerType></OfferBE><Gpc><segmentName>Communications</segmentName><familyName>Communications</familyName><className>Communicatieaccessoires</className><brickName>Hoesjes voor Mobiele Telefoon</brickName><chunkName>Hoesje voor mobiele telefoon</chunkName></Gpc><Category><unit>Electronics</unit><category>Mobile &amp; Tablets</category><productgroup>Phones Acc</productgroup><productsubgroup>Accessories Mobile</productsubgroup><subsubgroup>Accessories Mobile</subsubgroup></Category><description>&lt;lt/&gt;b&lt;gt/&gt;Let op! Dit hoesje past alleen op de Samsung Galaxy S8 (dus niet op de Samsung Galaxy S8+ en andere toestellen!&lt;lt/&gt;/b&lt;gt/&gt; Bescherm uw Samsung Galaxy S8 met dit geweldige telefoonhoesje. Dit hoesje is precies op maat gemaakt voor de Samsung Galaxy S8 waardoor het mooi aansluit. Het materiaal waaruit dit hoesje is vervaardigd is van zeer hoge kwaliteit. Met de aanschaf van dit duurzame telefoonhoesje zal uw smartphone gegarandeerd langer meegaan.</description><Properties><Property><key>AppearanceName</key><value>Physical</value></Property><Property><key>Colour</key><value>Meerkleurig</value></Property><Property><key>DeliveryMethod</key><value>Parcel</value></Property><Property><key>Material</key><value>Polycarbonaat</value></Property></Properties></Product> 
<Product xmlns="http://config.services.bol.com/schemas/product-1.1.xsd"><productId>9200000074000054</productId><ean>7101125954841</ean><title>Adapter Samsung Galaxy J710 - J7 2016 Origineel</title><productUrlNL>https://www.bol.com/nl/p/adapter-samsung-galaxy-j710-j7-2016-origineel/9200000074000054/</productUrlNL><productUrlBE>https://www.bol.com/be/p/adapter-samsung-galaxy-j710-j7-2016-origineel/9200000074000054/</productUrlBE><imageUrl>https://s.s-bol.com/imgbase0/imagebase3/large/FC/4/5/0/0/9200000074000054.jpg</imageUrl><brand>Merkloos</brand><OfferNL><sellingPrice>12.95</sellingPrice><shippingCost>0.00</shippingCost><condition>new</condition><isDeliverable>true</isDeliverable><ultimateOrderTime>18:00:00.000+02:00</ultimateOrderTime><maximalDeliveryDay>1</maximalDeliveryDay><sellerType>P</sellerType></OfferNL><Gpc><segmentName>Electrical Supplies</segmentName><familyName>Electrical Connection/Distribution</familyName><className>Batterijen en opladers</className><brickName>Opladers</brickName><chunkName>Oplader voor mobiele telefoon</chunkName></Gpc><Category><unit>Electronics</unit><category>Mobile &amp; Tablets</category><productgroup>Phones Acc</productgroup><productsubgroup>Accessories Mobile</productsubgroup><subsubgroup>Accessories Mobile</subsubgroup></Category><description>Productomschrijving Adapter Samsung Galaxy J710 - J7 2016 Origineel Heeft u behoefte aan een reserveoplader of kunt u uw huidige Samsung oplader niet meer vinden? Dan biedt deze 100% kwalitatieve Samsung oplader uitkomst! Haal ?m vandaag nog in huis! De Samsung adapter bevat tal van voordelen. Zo is de adapter voorzien van een EU Plug en zorgen de minimale afmetingen ervoor dat deze Samsung adapter ideaal is om bij u te dragen. Schaf nu een originele Samsung adapter met de juiste datakabel aan en ben verzekerd van een optimale oplaadkwaliteit dankzij de capaciteit van 2 Ampère. Kenmerken originele Samsung adapter Deze adapter wordt geleverd zonder datakabel en heeft de volgende specificaties:Merk: Samsung Capaciteit: 2 Ampère Type: ETA-U90EWEG Contact: EU PlugAansluiting: USB 2.0</description><Properties><Property><key>AppearanceName</key><value>Physical</value></Property><Property><key>DeliveryMethod</key><value>Parcel</value></Property></Properties></Product></Products> 

所以现在我的XPath不工作了的命名空间。我试图注册命名空间和改变我的XPath函数这个(使用一些示例代码,我发现):

PHP:

function findit($sku,$xml){ 
$xml->registerNamespace('prodfeed', 'http://config.services.bol.com/schemas/product-feed-1.1.xsd'); 
$xml->registerNamespace('prod', 'http://config.services.bol.com/schemas/product-1.1.xsd'); 

$nodes = $xml->xpath('/prodfeed:Products/prodfeed:Product/prod:productId[.='.$sku.']/parent::*'); 

var_dump($nodes); 

}

但它至今没有工作。我在这里朝着正确的方向走吗?

回答

1

XML文档在这改变了默认的命名空间时,得到的产品元素,所以指出你需要开始使用prod命名空间而不是prodfeed命令空间。

通过将开头'[''移回到productId之前,这意味着您不必执行parent :: *位,也可以简化查询。

$nodes = $xml->xpath('/prodfeed:Products/prod:Product[prod:productId=' . $sku . ']'); 
1

正在注册2个命名空间prodfeedprod,但在你的XPath只使用 'prodfeed'。

也许这将帮助,如果你可以改变这一行:

$nodes = $xml->xpath('/prodfeed:Products/prodfeed:Product/prod:productId[.='.$sku.']/parent::*'); 

这样:

$nodes = $xml->xpath('/prodfeed:Products/prod:Product/prod:productId[.=' . $sku . ']/parent::*');