xpath查询选中

时间:2015-08-14 11:50:12

标签: php xpath

我需要抓住带有特定标签的标签内的文字 在其中包含已检查无线电输入的类。

这是HTML:

<div id="ships-from2">

    <label for="ship_hk_intl">
        <input type="radio" name="ship_mode_name" id="ship_hk_intl" data-action="http://www.example.com/" value="hk_intl">
            Hong Kong Warehouse - USD44.31
    </label>

    <label for="ship_us_intl">
        <input type="radio" name="ship_mode_name" id="ship_us_intl" data-action="http://www.example.com/" checked value="us_intl">
            United States Warehouse - USD45.10
    </label>

</div>


我需要:
带有选中单选按钮的标签内的字符串。 实际的单选按钮可能会改变,所以我需要检查哪一个被检查

我正在抓dom并使用xpath但不知道如何编写查询 任何想法?

编辑1 - 代码很快(对@TimDev的回应):

    $div        = $dom->getElementById('ships-from2');
    $query      = '//input[@checked]/../text()';
    $e          = $xpath->query($query, $div);
    echo 'TEST:'.trim($e->item(1)->nodeValue);

4 个答案:

答案 0 :(得分:1)

您可能需要稍微调整一下查询,但它会返回无线电输入字段,您可以轻松检查所需的属性。

    $html='
        <div id="ships-from2">
            <label for="ship_hk_intl">
                <input type="radio" name="ship_mode_name" id="ship_hk_intl" data-action="http://www.example.com/" value="hk_intl">
                    Hong Kong Warehouse - USD44.31
            </label>
            <label for="ship_us_intl">
                <input type="radio" name="ship_mode_name" id="ship_us_intl" data-action="http://www.example.com/" checked value="us_intl">
                    United States Warehouse - USD45.10
            </label>
        </div>';

        $dom=new DOMDocument;
        $dom->loadHTML( $html );
        $xpath=new DOMXPath( $dom );
        $col=$xpath->query('//label/input');

        foreach( $col as $node ) if( $node->hasAttribute('checked') ) {
            echo $node->getAttribute('value').' '.$node->parentNode->nodeValue;
        }
        $dom=null;
        $xpath=null;

答案 1 :(得分:1)

使用xpath你可以这样做

//input[@checked]/..

获取文字

//input[@checked]/../text()

&#13;
&#13;
function test(field) {
  console.log(field.parentElement.innerText);
}
&#13;
<div id="ships-from2">

    <label for="ship_hk_intl">
        <input type="radio" onchange="test(this)" name="ship_mode_name" id="ship_hk_intl" data-action="http://www.example.com/" value="hk_intl">
            Hong Kong Warehouse - USD44.31
    </label>

    <label for="ship_us_intl">
        <input type="radio" onchange="test(this)"  name="ship_mode_name" id="ship_us_intl" data-action="http://www.example.com/" checked value="us_intl">
            United States Warehouse - USD45.10
    </label>

</div>
&#13;
&#13;
&#13;

答案 2 :(得分:0)

我不确定为什么raghavendra会提供javascript,但这是一个PHP示例。 他正确使用//input[@checked]/../text()

注意: ../text()返回两项文字。它返回所有 input节点的周围文本。这也是<label><input>之间的空格。

这就是为什么在下面的代码段中我们得到了$e->item(1)->nodeValue

的第二个文本
$html = <<<EOC
<div>
    More HTML!
</div>
<div>
   Even more HTML!
</div>
<div id="ships-from2">
    <label for="ship_hk_intl">
        <input type="radio" name="ship_mode_name" id="ship_hk_intl" data-action="http://www.example.com/"
               value="hk_intl"/>
        Hong Kong Warehouse - USD44.31
    </label>
    <label for="ship_us_intl">
        <input type="radio" name="ship_mode_name" id="ship_us_intl" data-action="http://www.example.com/" checked
               value="us_intl"/>
        United States Warehouse - USD45.10
    </label>
</div>
EOC;

$doc = new DOMDocument();
$doc->loadHTML($html);
$xpathObject = new DOMXPath($doc);

$div = $doc->getElementById('ships-from2');
$query = '//input[@checked]/../text()';
$e = $xpathObject->query($query, $div);
echo trim($e->item(1)->nodeValue);

答案 3 :(得分:-2)

首先,它不是有效的XML。每个属性都必须有一个值,所以替换

 ...data-action="http://www.example.com/" checked value="us_intl">

 ata-action="http://www.example.com/" checked="true" value="us_intl" />

然后您的xpath将如下所示:

  //input[@checked="true" and  @id="ship_us_intl"]