1

TFHppleの使用に問題があるため、ここにあります:次の行を解析したいと思います:

<div class=\"head\" style=\"height: 69.89px; line-height: 69.89px;\">
    <div class=\"cell editable\" style=\"width: 135px;\"contenteditable=\"true\">
        <p>&nbsp;1</p>
    </div>
    <div class=\"cell\" style=\"width: 135px;\" contenteditable=\"false\">
        <p>2</p>
    </div>
</div>

<div style=\"height: 69.89px; line-height: 69.89px;\" class=\"head\">
    <div class=\"cell\" style=\"width: 135px; text-align: left;\"contenteditable=\"false\">
        <p>3&nbsp;</p>
    </div>
    <div class=\"cell\" style=\"width: 135px;\" contenteditable=\"false\">
        <p>4</p>
    </div>
</div>

<div style=\"height: 69.89px; line-height: 69.89px;\" class=\"\">
    <div class=\"cell\" style=\"width: 135px;\" contenteditable=\"false\">
        <p>5</p>
    </div>
    <div class=\"cell\" style=\"width: 135px;\" contenteditable=\"false\">
        <p>6</p>
    </div>
</div>

div今のところ、 「要素」の最初のレベル (適切な用語がわかりません) を配列に入れたいと思います。/divだから私は単にメソッドにxPathとして与えることでそれをやろうとしましたsearchWithXPathQueryが、何も見つかりません。

私の2番目の解決策は、この種のパスを使用してみることでした://div[@class=\"head\"]しかし、許可することもでき[@class=\"\"]ますが、それが可能かどうかさえわかりません。(要素がデータ内と同じ順序で配列内にある必要があるため、そうしたいと思います)

これが私の質問です。TFHpple が動作しない特定の理由はあり/divますか? の最初のレベルだけを取得する方法がない場合div、xPath (ここでは属性class) を使用して属性の値に述語を作成することは可能ですか? (そしてどうやって?私は今かなり探しましたが、何も見つかりませんでした)

ご協力いただきありがとうございます。

PS:それが役立つ場合、データを試して解析するために使用するコードは次のとおりです。最初に文字列に含まれていますself.material.Text

NSData * data = [self.material.Text dataUsingEncoding:NSUnicodeStringEncoding];
TFHpple * tableParser = [TFHpple hppleWithHTMLData:data];
NSString * firstXPath = @"/div";
NSArray<TFHppleElement *> * tableHeader = [tableParser searchWithXPathQuery:firstXPath];
NSLog(@"We found : %d", tableHeader.count);
4

2 に答える 2

0

あなたが書いた:

TFHpple を使用して最初のレベルを取得する

私はあなたが意味していると思います:すべての子孫も取得せずに?

他の要件を考慮して、次のように行うことができます。

//div[not(ancestor::div)][@class='head' or @class='']

これを分析する:

  • ドキュメント全体の任意のレベルで、すべての div 要素を選択します (はい、正しい用語です ;)。//div
  • div の祖先 (a の親の親の親の親) があるかどうかを確認することにより、div 自体を含まない要素の述語 (括弧内のもの) でフィルター処理します。[not(ancestor::div)]
  • 他の要件でフィルタリングします。[@class='head' or @class='']

注 1: 指定された XML は無効です。複数のルート要素が含まれています。XML は、最大で 1 つのルート要素を持つことができます。

注 2:最初に @class または空の @class ですべての div を取得し、次に "first level" の div のみを取得する必要がある場合は、述語を逆にします。

//div[@class='head' or @class=''][not(ancestor::div)]
于 2015-09-16T08:43:46.080 に答える