PHP xPath - 如何限制多个查询中的值?

时间:2014-02-21 10:15:34

标签: php xml xpath

我必须从XML文档中的每个块中选择4个值中的3个。 到目前为止这是有效的。

但现在我必须限制结果。 行[1]包含从1到300的整数,但我需要的值仅为300。

$xpath = new \DOMXPath($dom);

$this->nodes = $xpath->query("
        //row[position()>1]//cell[1]/data
        | //row[position()>1]//cell[2]/data
        | //row[position()>1]//cell[3]/data
        | //row[position()>1]//cell[data<300]
    ");

XML文档在这里看起来像这样:

   <Row ss:AutoFitHeight="0">
    <Cell ss:StyleID="s63"><Data ss:Type="Number">62</Data></Cell>
    <Cell ss:StyleID="s63"><Data ss:Type="String">..</Data></Cell>
    <Cell ss:StyleID="s63"><Data ss:Type="String">Ethiopia PDR</Data></Cell>
    <Cell ss:StyleID="s63"><Data ss:Type="String">Ethiopia PDR</Data></Cell>
   </Row>
   <Row ss:AutoFitHeight="0">
    <Cell ss:StyleID="s63"><Data ss:Type="Number">63</Data></Cell>
    <Cell ss:StyleID="s63"><Data ss:Type="String">EE</Data></Cell>
    <Cell ss:StyleID="s63"><Data ss:Type="String">Estonia</Data></Cell>
    <Cell ss:StyleID="s63"><Data ss:Type="String">the Republic of Estonia</Data></Cell>
   </Row>

修改

在您的帮助下,它现在可以

$this->nodes = $xpath->query("
        //row[position()>1]/cell[data<300]/data
        | //row[position()>1]/cell[2]/data
        | //row[position()>1]/cell[3]/data
    ");

但是现在最后有一些查询似乎忽略的行:

   <Row ss:AutoFitHeight="0">
    <Cell ss:StyleID="s63"><Data ss:Type="Number">5600</Data></Cell>
    <Cell ss:StyleID="s64"/>
    <Cell ss:StyleID="s63"><Data ss:Type="String">Antarctic Region</Data></Cell>
    <Cell ss:StyleID="s63"><Data ss:Type="String">Antarctic Region</Data></Cell>
   </Row>
   <Row ss:AutoFitHeight="0">
    <Cell ss:StyleID="s63"><Data ss:Type="Number">5706</Data></Cell>
    <Cell ss:StyleID="s64"/>
    <Cell ss:StyleID="s63"><Data ss:Type="String">European Union</Data></Cell>
    <Cell ss:StyleID="s63"><Data ss:Type="String">European Union</Data></Cell>
   </Row>

现在第二个“单元格”为空,查询忽略只打印低于300的数据集。或者更好的是这是一个不想要的结果:

European Union - Antarctic Region

我的结果中还显示了ID超过300的这些内容。 我猜我只能获得行[1] +行[2] +行[3] ???

2 个答案:

答案 0 :(得分:0)

//Row[1]//Cell[1]/Data[.<=300]

答案 1 :(得分:0)

在阅读了关于复杂性的评论后(你的查询还可以吗?)试试cell[data<300]/data,它还返回数据,而不是单元格。

摘要:也许优化的查询类似于

  //row[position()>1 and ./cell[1]/data<300]//data

但是你说“4个值中的3个”(并显示前3个)...好的,现在正在......检查是否有,

  //row[position()>1 and ./cell[1]/data<300]/cell[position()<4]/data