2015-02-14 3 views
-1

У меня есть XML-документ в следующей структуре.php xpath итерация через внутренние узлы, получение значений на основе определенных атрибутов

<rows pos="0" rec_count="200"> 
    <row id="109"> 
     <cell style="" fieldName="pid">104</cell> 
     <cell style="" fieldName="title">Mr.</cell> 
     <cell style="" fieldName="name">Vladimir</cell> 
     <cell style="" fieldName="projectcode">879</cell> 
     <cell style="" fieldName="clientstatus">1000000000</cell> 
    </row> 
    <row id="111"> 
     <cell style="" fieldName="pid">105</cell> 
     <cell style="" fieldName="title">Mr.</cell> 
     <cell style="" fieldName="name">Barak</cell> 
     <cell style="" fieldName="projectcode">789/cell> 
     <cell style="" fieldName="clientstatus">1000000000</cell> 
    </row> 
</rows> 

Теперь мне нужно получить значение каждой строки, в массив, где каждый элемент строки представляет собой ассоциативный массив, в котором FIELDNAME из выше, становится ключом, значение элемента является значением узла.

Как я могу выполнить это с помощью XPath?

Я пробовал несколько методов; пока никто не работал.

Спасибо @JeffreyBosboom, @Makyen за ваш ответ.

Самый успешный я пришел следующим образом.

foreach ($xml->xpath('//row') as $node) { 
    foreach($node->cell as $cell) { 
     var_dump((string)$cell[0]); 
    } 
} 

С его помощью я могу получить значение узла. Но мне нужно, чтобы получить атрибут FIELDNAME извлеченный в каждой итерации

+0

У вас больше шансов получить помощь, если вы покажете нам, что вы пробовали, и объясните, почему эти попытки не сделали то, что вы хотите. –

+0

Какой код вы уже пробовали? Пожалуйста, * [изменить] вопрос *, чтобы включить исходный код в вопрос. См. [Какие темы можно задать здесь?] (Http://stackoverflow.com/help/on-topic), [Как задать хороший вопрос?] (Http://stackoverflow.com/help/how -to-ask) и [Как создать минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve). – Makyen

+0

'(string) $ cell' является значением элемента * cell * и' (string) $ cell ['fieldName'] 'атрибута * fieldName *. – hakre

ответ

1

ли вы имеете в виду что-то вроде этого:

$arr = array(); 
$s = simplexml_load_string($xml); 

//First we search all the <cell> nodes within <row> nodes 
foreach($s->xpath("//row/cell") as $node) 
{ 
    //For all found nodes we retrieve its ID from ancestor (<row>) 
    //attribute named id 
    $id = $node->xpath("../@id"); 
    $id = (int)$id[0]; 
    if(!isset($arr[$id])) 
    { 
     $arr[$id] = array(); 
    } 

    //Then we iterate through all attributes of found <cell> nodes 
    //to find the attribute named fieldName 
    foreach($node->attributes() as $key=>$att) 
    { 
     if($key=='fieldName') 
     { 
      $arr[$id][(string)$att] = (string)$node; 
     } 

    } 
} 

//In $arr array there will be desired output 
echo "<pre>"; 
print_r($arr); 
echo "</pre>"; 

?

+1

Пожалуйста, объясните свой код немного больше, чтобы другие люди могли извлечь из этого выгоду! – KhorneHoly

+0

Готово. Надеюсь, я достаточно четко. –