2015-09-30 2 views
2

Я использую XML для вставки продуктов в свой db с помощью PHP. Я могу получить доступ/читать фид XML с помощью следующего кода:
Получить значения XML-фид по имени - PHP

$xml=simplexml_load_file('testfeed.xml') or die("Error: Cannot create object"); 
foreach($xml->children() as $product) { 
    $pname = $product->name; 
    $pdescr = $product->description; 
    echo $pname; 
    echo $pdescr; 
    } 

Ниже мой пример XML:

<product ID="9"> 
<name>Product X</name> 
<properties> 
<property name="categoryPath"> 
<value>path-to-category</value> 
</property> 
<property name="stock"> 
<value>1</value> 
</property> 
</properties> 
</product> 

Это легко получить значения для имени, но как я могу получить значение из категорииpath, так как этот находится внутри свойств -> свойство-> значение и объявлен в <property name="categoryPath">?

Спасибо!

+0

вы можете изменить имя XML-тег "значение"? – Paladin

ответ

2

Самый простой способ без зацикливания слишком много через структуры будут использовать XPath:

$values = $xml->xpath('//property[@name="categoryPath"]/value'); 

Просто цикл через возвращаемый массив и поверг каждый результат в строку, когда это необходимо, и вы сделали.

+0

Привет, спасибо за помощь! Какой путь мне нужно установить? Полный путь: $ xml-> xpath ('/ products/product/properties/property [@ name = "categoryPath"]/value')? – Remyzzz

+0

зависит от вашей структуры xml. тот, который я написал в этом примере, предоставит вам все узлы свойств, имеющие атрибут name с заданным значением, независимо от того, где они находятся в структуре. Если, по определению, вы можете предоставить полный абсолютный путь, вы должны предпочесть это по соображениям производительности. третий случай был бы тем, где у вас есть узлы свойств по разным путям, но вам не нужны все. затем используйте полный путь. – jossif

+0

Привет, Джоссиф, спасибо! Если я использую ваш пример, я получаю вывод «Массив». Я что-то упускаю? – Remyzzz

0

Update: Хотя ответ Jossif очень хорош при получении всех узлов навалом я в том числе правки для обновленной структуры XML без использования xpath:

$property = $product->properties->property; 
$propertyAttribute = $property->attributes()->{'name'}; 

$catPath = ($propertyAttribute=="categoryPath")? $property->value : "value for missing paths"; 

print $catPath . PHP_EOL; 

Поскольку вам не кажется, чтобы иметь любые другие подобные узлы xml, вам не нужен атрибут для их разделения.

Вы должны иметь возможность безопасно использовать этот

$catPath = $product->properties->property->value; 
print $catPath; 

, чтобы получить строку из value узла.

+0

Привет, извините за мой ограниченный пример xml, но он имеет аналогичные узлы xml, поэтому есть больше узлов с именем «value» – Remyzzz

+0

, можете ли вы опубликовать более качественный и простой пример xml? –

+0

Привет, Алекс, спасибо за вашу помощь. Я добавил еще один узел к примеру, такую ​​же структуру с добавлением имени «запас». – Remyzzz

0
$xml=simplexml_load_file('./testfeed.xml') or die("Error: Cannot create object"); 
foreach($xml->children() as $product) { 
    $pname = $product->name; 
    $pdescr = $product->properties->property["name"]; 
    $pdvalue = (string)$product->properties->property->value; 
    echo "Prdo Name: $pname\n"; 
    echo "Prod Desc: $pdescr\n"; 
    echo "Prod Value: $pdvalue\n"; 

} 

Выход:

Prdo Name: Product X 
    Prod Desc: categoryPath 
    Prod Value: path-to-category 
Смежные вопросы