[英]PHP check if element exists in XML
我嘗試讀取XML文件,在表中顯示數據,然后將所需的數據寫入MySQL數據庫,以便以后可以將數據提取為CSV。
XML中的是一組具有相同名稱的數據。
每個產品都有不同數量的<props> (最多20個),我想檢查元素<props>是否退出。 現在,我從道具中獲取所有“數據”。
我很難解釋,因此我將顯示帶有特定數據的嵌套元素。 編輯:現在產品的完整數據。
<?xml version="1.0" encoding="UTF-8"?>
<products>
<product>
<id>1</id>
<artnr>3009000555</artnr>
<title>product</title>
<description>Some long text</description>
<brand>
<id>458</id>
<title>Brand</title>
</brand>
<date>11-05-2015</date>
<modifydate>07-05-2016</modifydate>
<variants>
<variant>
<id>35021</id>
<type></type>
<subartnr>3009000555</subartnr>
<ean>85252000555</ean>
<stock>Y</stock>
</variant>
</variants>
<price>
<currency>EUR</currency>
<b2b>9.39</b2b>
<b2c>16.95</b2c>
<vatnl>21</vatnl>
<vatde>19</vatde>
<discount>N</discount>
</price>
<categories>
<category>
<cat>
<id>1</id>
<title>Maincat</title>
</cat>
<cat>
<id>182</id>
<title>Subcat</title>
</cat>
</category>
</categories>
<measures>
<length>4.00</length>
<weight>243</weight>
<packing>10x9x10</packing>
</measures>
<properties>
<prop>
<propid>25</propid>
<property>Farbe</property>
<valueid>208</valueid>
<value>Weiß</value>
</prop>
<prop>
<propid>41</propid>
<property>Geeignet für</property>
<valueid>229</valueid>
<value>Unisex</value>
</prop>
<prop>
<propid>43</propid>
<property>Verpackung</property>
<valueid>236</valueid>
<value>Einzelhandelverpackung (Karton)</value>
</prop>
<prop>
<propid>54</propid>
<property>Gesamturteil</property>
<valueid>289</valueid>
<value>5</value>
</prop>
<prop>
<propid>70</propid>
<property>Garantie</property>
<valueid>326</valueid>
<value>Ja</value>
</prop>
<prop>
<propid>71</propid>
<property>Art der Garantie</property>
<valueid>328</valueid>
<value>Good Warranty Service</value>
</prop>
</properties>
<material>
<id>101</id>
<title>Keramik</title>
</material>
<popularity>3</popularity>
<pics>
<pic>3009000022.jpg</pic>
<pic>3009000022_2.jpg</pic>
</pics>
</product>
<product>
這就是我現在所擁有的,但是正如我之前所說,我還獲得了不存在的道具作為空數據。 例如:: 7, 編輯。 現在我的整個代碼。 該產品只有7個<道具>,其他9個或更多。 所以我只需要展示現有的道具。 但是,即使它們不存在,我也可以從prop [0]到prop [19]。
<html>
<table id="mytable">
<thead>
<tr>
<th>Artnr</th>
<th>Name</th>
<th>Beschreibung</th>
<th>Hersteller</th>
<th>EAN</th>
<th>Vorrat</th>
<th>Preis EK</th>
<th>Preis VK</th>
<th>Sonderangebot</th>
<th>Kategorie</th>
<th>Eigenschaften</th>
<th>Bild URL</th>
</tr>
</thead>
<tbody>
<?php
$url = ('http://somdom.com/test1.xml');
$xml = simplexml_load_file( urlencode($url), null, true);
$kommaleerz = ', ';
$doppelpunkt = ':';
$bildaddy = 'http://somedom.com/img/product_pic/500/';
foreach ( $xml->product as $prods ) :?>
<tr>
<td><?php echo $prods->artnr; ?></td>
<td><?php echo $prods->title; ?></td>
<td><?php echo $prods->description; ?></td>
<td><?php echo $prods->brand->title; ?></td>
<td><?php echo $prods->variants->variant->ean; ?></td>
<td><?php echo $prods->variants->variant->stock; ?></td>
<td><?php echo $prods->price->b2b; ?></td>
<td><?php echo $prods->price->b2c; ?></td>
<td><?php echo $prods->price->discount; ?></td>
<td><?php echo $prods->categories->category->cat[1]->title; ?></td>
<td><?php if (isset($prods->properties->prop)) {echo $prods->properties->prop[0]->property . $doppelpunkt . $prods->properties->prop[0]->value .$doppelpunkt .'1' .$kommaleerz
.$prods->properties->prop[1]->property . $doppelpunkt . $prods->properties->prop[1]->value .$doppelpunkt .'2' .$kommaleerz
.$prods->properties->prop[2]->property . $doppelpunkt . $prods->properties->prop[2]->value .$doppelpunkt .'3' .$kommaleerz
.$prods->properties->prop[3]->property . $doppelpunkt . $prods->properties->prop[3]->value .$doppelpunkt .'4' .$kommaleerz
.$prods->properties->prop[4]->property . $doppelpunkt . $prods->properties->prop[4]->value .$doppelpunkt .'5' .$kommaleerz
.$prods->properties->prop[5]->property . $doppelpunkt . $prods->properties->prop[5]->value .$doppelpunkt .'6' .$kommaleerz
.$prods->properties->prop[6]->property . $doppelpunkt . $prods->properties->prop[6]->value .$doppelpunkt .'7' .$kommaleerz
.$prods->properties->prop[7]->property . $doppelpunkt . $prods->properties->prop[7]->value .$doppelpunkt .'8' .$kommaleerz
.$prods->properties->prop[8]->property . $doppelpunkt . $prods->properties->prop[8]->value .$doppelpunkt .'9' .$kommaleerz
.$prods->properties->prop[9]->property . $doppelpunkt . $prods->properties->prop[9]->value .$doppelpunkt .'10' .$kommaleerz
.$prods->properties->prop[10]->property . $doppelpunkt . $prods->properties->prop[10]->value .$doppelpunkt .'11' .$kommaleerz
.$prods->properties->prop[11]->property . $doppelpunkt . $prods->properties->prop[11]->value .$doppelpunkt .'12' .$kommaleerz
.$prods->properties->prop[12]->property . $doppelpunkt . $prods->properties->prop[12]->value .$doppelpunkt .'13' .$kommaleerz
.$prods->properties->prop[13]->property . $doppelpunkt . $prods->properties->prop[13]->value .$doppelpunkt .'14' .$kommaleerz
.$prods->properties->prop[14]->property . $doppelpunkt . $prods->properties->prop[14]->value .$doppelpunkt .'15' .$kommaleerz
.$prods->properties->prop[15]->property . $doppelpunkt . $prods->properties->prop[15]->value .$doppelpunkt .'16' .$kommaleerz
.$prods->properties->prop[16]->property . $doppelpunkt . $prods->properties->prop[16]->value .$doppelpunkt .'17' .$kommaleerz
.$prods->properties->prop[17]->property . $doppelpunkt . $prods->properties->prop[17]->value .$doppelpunkt .'18' .$kommaleerz
.$prods->properties->prop[18]->property . $doppelpunkt . $prods->properties->prop[18]->value .$doppelpunkt .'19' .$kommaleerz
.$prods->properties->prop[19]->property . $doppelpunkt . $prods->properties->prop[19]->value .$doppelpunkt .'20' .$kommaleerz
.'Material' . $doppelpunkt . $prods->material->title .$doppelpunkt .'21' ;} ?> </td>
<td><?php echo $bildaddy . $prods->pics->pic[0] . $kommaleerz
.$bildaddy . $prods->pics->pic[1] . $kommaleerz
.$bildaddy . $prods->pics->pic[2] . $kommaleerz
.$bildaddy . $prods->pics->pic[3] . $kommaleerz
.$bildaddy . $prods->pics->pic[4] . $kommaleerz
.$bildaddy . $prods->pics->pic[5] . $kommaleerz
.$bildaddy . $prods->pics->pic[6] . $kommaleerz
.$bildaddy . $prods->pics->pic[7] . $kommaleerz
.$bildaddy . $prods->pics->pic[8] . $kommaleerz
.$bildaddy . $prods->pics->pic[9] . $kommaleerz
.$bildaddy . $prods->pics->pic[10] . $kommaleerz
.$bildaddy . $prods->pics->pic[11] . $kommaleerz
.$bildaddy . $prods->pics->pic[12] . $kommaleerz
.$bildaddy . $prods->pics->pic[13] . $kommaleerz
.$bildaddy . $prods->pics->pic[14] . $kommaleerz
.$bildaddy . $prods->pics->pic[15] . $kommaleerz
.$bildaddy . $prods->pics->pic[16] . $kommaleerz
.$bildaddy . $prods->pics->pic[17] . $kommaleerz
.$bildaddy . $prods->pics->pic[18] . $kommaleerz
; ?></td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</body>
</html>
SimpleXML為屬性實現不同的接口。 如果您將其用作字符串,它將返回第一個匹配元素的內容。 如果像列表一樣使用它,則可以迭代所有匹配的元素。
$products = new SimpleXmlElement($xml);
foreach ($products->product as $product) {
foreach ($product->properties->prop as $property) {
var_dump((string)$property->property);
}
}
輸出:
string(5) "Farbe"
string(13) "Geeignet für"
string(10) "Verpackung"
string(12) "Gesamturteil"
string(8) "Garantie"
string(16) "Art der Garantie"
我建議為您要閱讀的每個propid
定義一個默認值數組。 propid
應該比標題更穩定,並且不特定於語言。 在內部循環中,您驗證當前ID是否存在於該數組中,並分配value
或valueid
。
foreach ($products->product as $product) {
// default values for each product property by `prodid`
$row = [
'25' => '',
'41' => ''
];
foreach ($product->properties->prop as $property) {
$id = (string)$property->propid;
if (array_key_exists($id, $row)) {
$row[$id] = (string)$property->value;
}
}
var_dump($row);
}
輸出:
array(2) {
[25]=>
string(5) "Weiß"
[41]=>
string(6) "Unisex"
}
這樣,結果將始終具有相同的元素計數和順序。
要獲取特定屬性,請使用Xpath。 例如獲取與財產propid
25:
foreach ($products->product as $product) {
$colors = $product->xpath('properties/prop[propid = 25]');
if (count($colors) > 0) {
var_dump((string)$colors[0]->property);
}
}
SimpleXmlElement::xpath()
將始終返回SimpleXmlElement
對象的數組。 驗證元素計數以檢查Xpath表達式是否找到節點。
DOM甚至允許您直接獲取標量值。 如果沒有節點匹配,它將返回一個空值。 DOMXpath::evaluate()
的結果取決於表達式。 位置路徑返回一個可通過foreach
遍歷的DOMNodeList
。 產生標量的表達式將返回標量值。
$document = new DOMDocument();
$document->loadXml($xml);
$xpath = new DOMXpath($document);
foreach ($xpath->evaluate('/products/product') as $product) {
$hasColor = $xpath->evaluate('count(properties/prop[propid = 25]) > 0', $product);
if ($hasColor) {
var_dump('Color:', $xpath->evaluate('string(properties/prop[propid = 25]/valueid)', $product));
}
}
輸出:
string(6) "Color:"
string(3) "208"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.