2017-10-09 80 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::*');