Это зависит от того, что вы подразумеваете под «стоимостью». Если у вас есть что-то вроде
<spec3 />Value</spec3>
Тогда readInnerXML должен дать вам вашу ценность.
Если ваше значение в атрибуте,
<spec1 foo="my attribute" />
Вам нужно будет использовать метод getAttribute объекта XMLReader или явно указать читателю, чтобы он приступил к анализу атрибутов. Посмотрите пример кода ниже для нескольких способов сделать это.
Наконец, если узел содержит больше вложенного XML,
<spec2><foo><baz thing="la de da">Value</baz></foo></spec2>
В этот момент нет прямого пути для читателя понять ценности / элементы внутри него. Вам нужно будет выполнить одно из следующих действий
- Измените код синтаксического анализа вашего читателя, чтобы подключаться к элементам на этих глубинах
- Возьмите кусок XML из readInnerXML и начните его анализ со вторым экземпляром XMLReader,
- Возьмите кусок XML из readInnerXML и начните его анализ с другой библиотекой синтаксического анализа XML.
Вот пример кода для разбора атрибутов
$reader = new XMLReader();
$reader->xml(trim('
<root>
<thing>
<specs>
<spec1 foo="my attribute">Value</spec1>
<spec3>
My Text
</spec3>
<spec2 foo="foo again" bar="another attribute" baz="yet another attribute" />
</specs>
<details />
<more_info>
<info1 />
<info2 />
</more_info>
</thing>
</root>
'));
$last_node_at_depth = array();
$already_processed = array();
while($reader->read()){
$last_node_at_depth[$reader->depth] = $reader->localName;
if(
$reader->depth > 0 &&
$reader->localName != '#text' &&
$last_node_at_depth[($reader->depth-1)] == 'specs' &&
!in_array ($reader->localName,$already_processed)
){
echo "\n".'Processing ' . $reader->localName . "\n";
$already_processed[] = $reader->localName;
echo '--------------------------------------------------'."\n";
echo 'The Value for the inner node ';
echo ' is [';
echo trim($reader->readInnerXML());
echo ']'."\n";
if($reader->attributeCount > 0){
echo 'This node has attributes, lets process them' . "\n";
//grab attribute by name
echo ' Value of attribute foo: ' . $reader->getAttribute('foo') . "\n";
//or use the reader to itterate through all the attributes
$length = $reader->attributeCount;
for($i=0;$i<$length;$i++){
//now the reader is pointing at attributes instead of nodes
$reader->moveToAttributeNo($i);
echo ' Value of attribute ' . $reader->localName;
echo ': ';
echo $reader->value;
echo "\n";
}
}
//echo $reader->localName . "\n";
}
}