【问题标题】:xmlreader child node valuexmlreader 子节点值
【发布时间】:2013-11-26 13:56:33
【问题描述】:

你好,我有这个 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 添加一些属性。

【问题讨论】:

    标签: php xmlreader


    【解决方案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 值

    也许有一种更简单的方法可以做到这一点,我对 XMLReader 并不完全熟悉,大多数情况下使用 SimpleXML。

    【讨论】:

    • @matterix 很高兴为您提供帮助,pozdrawiam ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多