5

ロードしたhtmlファイルがあるとすると、次のクエリを実行します。

$url = 'http://www.fangraphs.com/players.aspx';
$html = file_get_contents($url);    
$myDom = new DOMDocument;
$myDom->formatOutput = true;
@$myDom->loadHTML($html);
$anchor = $xpath->query('//a[contains(@href,"letter")]');

これにより、次のようなアンカーのリストが表示されます。

<a href="players.aspx?letter=Aa">Aa</a>

しかし、「players.aspx?letter=Aa」だけを取得する方法が必要です。

私は試すことができると思いました:

$anchor = $xpath->query('//a[contains(@href,"letter")]/@href');

しかし、次のことを試してみると、ノードを追加できなかったというphpエラーが発生します。

$xpath = new DOMXPath($myDom);
$newDom = new DOMDocument;
$j = 0;
while( $myAnchor = $anchor->item($j++) ){
   $node = $newDom->importNode( $myAnchor, true );    // import node
   $newDom->appendChild($node);
}

最初のクエリが選択するhrefタグの値だけを取得する方法はありますか?ありがとう!

4

3 に答える 3

3

使用

//a/@href[contains(., 'letter')]

これにより、(属性の)文字列値に文字列が含まれている任意のhref属性が選択a"letter"されます。

于 2012-05-15T13:12:23.923 に答える
0

XPathクエリはDOMAttr、要素(つまり、オブジェクト)ではなく、属性自体(つまり、オブジェクト)を返しますDOMElement。それは問題ありません、そしてそれはあなたが望むもののようです、しかしそれらを文書に追加することは問題です。ADOMAttrはドキュメントツリーのスタンドアロンノードではありません。これはに関連付けられていますが、通常の意味ではDOMElementではありません。したがって、ドキュメントに直接追加することは無効です。DOMAttr

W3C仕様から:

Attrオブジェクトはインターフェイスを継承しNodeますが、実際にはオブジェクトが記述する要素の子ノードではないため、DOMはオブジェクトをドキュメントツリーの一部とは見なしません。。。。DOMは、属性が関連付けられている要素とは別のIDを持つのではなく、属性が要素のプロパティであるという見方をします。

をに関連付けてDOMAttrそのDOMElement要素を追加するか、の値を引き出してDOMAttr必要に応じて使用します。

DOMTextプレーンテキストの値を追加するには、ノードでその値を使用して追加します。たとえば、次の行を変更します。

    $newDom->appendChild($node);

これに:

    $newDom->appendChild(new DOMText($node->value));
于 2012-05-15T19:31:11.020 に答える
0

これを試して..

$xml_string = 'your xml string';
$xml = simplexml_load_string($xml_string);
foreach($xml->a[0]->attributes() as $href => $value) {
    $myAnchorsValues[] = $value;
}

var_dump($myAnchorsValues);
于 2012-05-15T00:01:12.823 に答える