你好我有这个xml:
<pola_wlasne>
<pole>
<nazwa><![CDATA[STAN 1]]></nazwa>
<wartosc><![CDATA[5.33]]></wartosc>
</pole>
<pole>
<nazwa><![CDATA[Gatunek]]></nazwa>
<wartosc><![CDATA[I]]></wartosc>
</pole>
<pole>
<nazwa><![CDATA[pal]]></nazwa>
<wartosc><![CDATA[65,0900]]></wartosc>
</pole>
<pole>
<nazwa><![CDATA[op.]]></nazwa>
<wartosc><![CDATA[1,4150]]></wartosc> // <- how to read only this value?
</pole>
</pola_wlasne>
我想用xmlreader只读一个节点。我试图读取父的值,然后转到下一个节点,但它不起作用。
if ($reader->value == 'op.'){
$reader->next('wartosc');
}
(..)
case 'wartosc':
$reader->value; // <-- read all elements
break;
但它已从节点名称 wartosc 中读取所有值。我不能为这个xml添加一些属性。
答案 0 :(得分:1)
使用XMLReader有点复杂,你必须遍历所有XML并在下一个节点被引入时设置适当的标志。此外,您有CDATA部分,因此您需要检查它是否有正确的值读数。
代码:
$wartosc = 0; // flags
$nazwa = 0;
while ($xml->read()) {
if($wartosc && $xml->nodeType == XMLReader::CDATA){
// if we are in proper 'wartosc' node, and it's CDATA section
echo $xml->value; // read value
break; // end reading
}
if($xml->name == 'nazwa'){ // if we are in node 'nazwa'
$nazwa = 1; // set flag for reading next CDATA
}
if($nazwa && $xml->nodeType == XMLReader::CDATA){
// if we are in 'nazwa' node, and it's CDATA section
if($xml->value == 'op.'){ // .. and it's have 'op.' value
$wartosc = 1; // set flag for reading next 'wartosc' node value
} else {
$xml->next('pole'); // otherwise, skip to next 'pole' node
}
}
}
所以它返回正确:1,4150值
Mayby有一种更简单的方法,我对XMLReader并不熟悉,在大多数情况下使用SimpleXML。