、xpath経由の要素の復元力がありますか?私の前の質問から
は私が
html//p//table//tr//td/a
は、上記のXPathの間に表示任意の予期せぬ要素を扱うことができることを見出しました。上記のXPathが扱うことができる。例えば
:
html/p/div/table/tr/td/a
html/p/table/tr/td/b/div/a
はしかし、どのように私は不足している/予想外の要素に完全に弾力がXPathを策定することができますか?
/html/table/tr/td/a (p is missing)
/html/div/span/table/tr/td/a (p is missing and position replaced with `div/span/`)
XPath構文は、上記の場合に対処するために存在しています:
は例えば、冒頭で述べたXPathは、次の処理できませんか?もしそうでなければ、代替アプローチは何でしょうか?
xpathだけでは不可能なので、擬似コードを使用して次のアルゴリズムを利用しています。
基本的には、与えられたxpathを分割し、それぞれの祖先の直下の子を探します。予想される子が存在しないか、または他の要素である場合、現在の祖先のすべての子を掘り下げ、期待される子を発見しようとします。
function searchElement(){
elements[] = "/html/p/table/tr/td/a".split("/");
thisElement = "";
for (element in elements) {
if (firstItem){
thisElement = findElementByXpath(element);
}else{
try{
thisElement.findElementByXpath(element); //look for this element inside previous element (from previous iteration);
}catch(NotFoundException e){ //if element is not found, search all elements inside previous element, and look for it.
foundElement = false;
discoveredElement = thisElement.findElementByXpath("*");
while(foundElement != true){
if (discoveredElement.findEleemntByXpath(element) != null){
//successful, element found, overwrite.
thisElement = thisElement.findElementByXpath("*").findEleemntByXpath(element);
foundElement = true;
}else{
//not successful, keep digging.
discoveredElement = discoveredElement.findElementByXpath("*");
}
}
}
}
}
return thisElement;
}
これは最適なアプローチですか?私は "*"を探し、各要素を掘ることはむしろ非効率であると心配しています。
「xpath」以外にこの質問にタグを付けるべきかどうかわかりません。編集を自由にしてください。
ありがとうございます。
この質問は非常に不明です。あなたは達成したいと思っていることを明確にしていません。私はあなたが選択したいすべてのノードを指定し、従うルールを説明し、次にこれらのノードを選択するXPath式を尋ねる必要があると思います。この情報を指定できない場合、任意のノードを選択する汎用XPath式は次のようになります。 '// node()' –