У меня есть документ XML в следующей структуре.
<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, извлеченный в каждой итерации
Вы имеете в виду что-то вроде этого:
$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>";
?
Других решений пока нет …