DOBON.NETプログラミング道掲示板

■34762 / 親記事)  AngleSharpのクエリー文2
  
□投稿者/ Wan 一般人(15回)-(2021/06/08(Tue) 21:03:53)
  • アイコン環境/言語:[Windows10 VisualStudio2019 VB.net WindowsForm] 
    分類:[.NET] 

    Dim tmp = doc.QuerySelectorAll("h2")
    で、次のような
    {AngleSharp.Html.Dom.HtmlHeadingElement}のコレクションが返されたとします。
    <h2 class="hdg-l2-03"><span>ねずみ</span></h2>
    <h2 class="hdg-l2-03"><span>うし</span></h2>
    <h2 class="hdg-l2-03"><span>とら</span></h2>
    <h2 class="hdg-l2-03"><span>うさぎ</span></h2>
    <h2 class="hdg-l2-03"><span>たつ</span></h2>
    <h2 class="hdg-l2-03"><span>へび</span></h2>
    これを、
    Dim tmp2 = doc.QuerySelectorAll("h2").??????
    とLINQを続ける?ことによって
    ねずみ
    うし
    とら
    うさぎ
    たつ
    へび
    のようなコレクションを取得するLINQってどうやって書けばいいのでしょうか?
    また、tmpの各要素に対してQuerySelector文を適用してコレクションを取得することは出来るのでしょうか?
    (現在、tmpをFor Eachで回してQuerySelectorをかけています。
    
    詳しい方いらっしゃいましたご教授の程宜しくお願い致します。
    

マルチポストを報告
違反を報告
引用返信 削除キー/
■34763 / ResNo.1)  Re[1]: AngleSharpのクエリー文2
□投稿者/ Hongliang 大御所(604回)-(2021/06/08(Tue) 21:35:09)
  • アイコン例示されているものならこれだけも十分ですが。
    foreach (var text in tmp.Select(h => h.TextContent))

    > tmpの各要素に対してQuerySelector文を適用してコレクションを取得
    こんな?
    foreach (var text in tmp.SelectMany(h => h.QuerySelectorAll("span")).Select(s => s.TextContent))

    // セレクタだけだとテキストノードを選択できないな…。
違反を報告
引用返信 削除キー/
■34765 / ResNo.2)  Re[2]: AngleSharpのクエリー文2
□投稿者/ Wan 一般人(16回)-(2021/06/09(Wed) 08:00:00)
  • アイコンHongliang様
    早速のご指導有難う御座います。

    SelectManyってこうやって使うのですね?
    勉強になります。
    セレクタだけだとテキストノードを選択できないとのことで、
    For Eachは避けられないことを理解しました。

    大変助かります。
    有難う御座いました。
解決み!
違反を報告
引用返信 削除キー/
■34767 / ResNo.3)  Re[3]: AngleSharpのクエリー文2
□投稿者/ 魔界の仮面弁士 大御所(1347回)-(2021/06/09(Wed) 11:50:42)
  • アイコンNo34765に返信(Wanさんの記事)
    > セレクタだけだとテキストノードを選択できないとのことで、
    CSS セレクタは、「要素(Element)」ノードを対象とするものだからですね。
    QuerySelectorAll の結果が INode ではなく IElement のコレクションなのもそのため。

    XSLT などでも使われる XPath であれば、テキストノードや
    属性ノードを直接選択することもできます。


    > For Eachは避けられないことを理解しました。

    'Imports AngleSharp.Dom
    'Imports AngleSharp.XPath

    '--------------------
    ' QuerySelectorAll は CSS セレクタを使うため、結果は常に要素ノード
    Dim tmp0() As IElement = doc.QuerySelectorAll("h2").ToArray()

    '' 要素ノード配下のテキストノードを得るためには、
    '' TextContent プロパティや Text 拡張メソッドを使う
    Dim tmp1() As String = doc.QuerySelectorAll("h2.hdg-l2-03>span").Select(Function(n) n.TextContent).ToArray()
    Dim tmp2() As String = doc.QuerySelectorAll("h2[class]>span").Select(Function(n) n.Text()).ToArray()
    Dim tmp3() As String = doc.QuerySelectorAll("h2[class='hdg-l2-03']>span").Select(Function(n) n.InnerHtml).ToArray()
    Dim tmp4() As String = doc.QuerySelectorAll("h2 span").Select(Function(n) n.OuterHtml).ToArray()

    '--------------------
    ' SelectSingleNode / SelectNodes は XPath を使うため、結果は汎用ノードであり、
    ' 要素ノード以外の処理にも使える。CSS セレクタとは別構文。
    Dim tmp5() As INode = doc.Body.SelectNodes("//h2").ToArray()

    '' 要素だけでなくテキストノードやコメントノードも取得してみる
    Dim tmp6() As IElement = doc.Body.SelectNodes("//span").OfType(Of IElement)().ToArray()
    Dim tmp7() As String = doc.Body.SelectNodes("//h2/span/text()").Select(Function(n) n.NodeValue).ToArray()
    Dim tmp8() As IText = doc.Body.SelectNodes("//h2/span/text()").OfType(Of IText)().ToArray()
    Dim tmp9() As IComment = doc.Body.SelectNodes("//comment()").OfType(Of IComment)().ToArray()
解決み!
違反を報告
引用返信 削除キー/
■34775 / ResNo.4)  Re[4]: AngleSharpのクエリー文2
□投稿者/ 魔界の仮面弁士 大御所(1352回)-(2021/06/10(Thu) 09:56:56)
  • アイコン2021/06/10(Thu) 09:57:36 編集(投稿者)

    # 解決済みチェックを外してしまっていたので再チェック

    No34767に追記(魔界の仮面弁士の記事)
    > XSLT などでも使われる XPath であれば、テキストノードや
    > 属性ノードを直接選択することもできます。
    > 'Imports AngleSharp.XPath

    「属性ノード」について補足。

    AngleSharp.XPath で属性ノードを選択した場合(例:"h2/@class")、
    属性(IAttr)そのものではなく、その属性を持った要素ノードが返されてしまう
    問題がありましたが、これには破壊的修正が入るようです。
    今後リリースされる版では、正しく属性を返せるようになるでしょう。

    https://github.com/AngleSharp/AngleSharp.XPath/issues/23
    https://github.com/AngleSharp/AngleSharp.XPath/pull/24
    https://github.com/AngleSharp/AngleSharp.XPath/pull/25
解決み!
違反を報告
引用返信 削除キー/



スレッド内ページ移動 / << 0 >>

このスレッドに書きこむ

Mode/  Pass/


- Child Tree -