【问题标题】:Kotlin Multiplatform/JS Unresolved reference Document.evaluate()Kotlin Multiplatform/JS 未解决参考 Document.evaluate()
【发布时间】:2023-02-01 01:19:47
【问题描述】:

语境:Kotlin 多平台 JavaScript.

我正在尝试使用 Document.evaluate() 但得到的是 Unresolved reference: evaluate 和 Unresolved reference: XPathResult。

import org.w3c.dom.Document
import org.w3c.dom.parsing.DOMParser

object JavascriptTest {
    // language=HTML
    private val html = """
            <body>
               <div>
                  <a class="button" href="http://exaple.com">Example</a>
               </div>
            </body>
        """.trimIndent()

    fun parseXpath() {
        val parser = DOMParser()
        val document: Document = parser.parseFromString(html, "text/html")
        val xpath = "//div/a[contains(@class, \"button\")]"
        document.evaluate(xpath, document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null)
    }
}

构建.gradle.kts

kotlin {
    js(IR) {
        useCommonJs()
        browser {}
        binaries.executable()
    }

   sourceSets {
      val jsTest by getting
   }

【问题讨论】:

    标签: kotlin kotlin-multiplatform kotlin-js


    【解决方案1】:

    据我所知,XPathEvaluator 接口目前没有开箱即用的绑定。但是你可以使用asDynamic自己添加它们:

    val XPathResult = window.asDynamic().XPathResult
    
    fun Document.evaluate(
        xpathExpression: String,
        contextNode: Node,
        namespaceResolver: Any?,
        resultType: Any,
        result: Any?
    ): dynamic =
        asDynamic().evaluate(xpathExpression, contextNode, namespaceResolver, resultType, result)
    
    

    【讨论】:

      【解决方案2】:

      作为@Evgeny 解决方案的替代方案,您还可以使用Use JavaScript code from Kotlin 中建议的标记为external 的此类

      external class XPathResult {
      
          companion object {
              val ANY_TYPE: Int
              val NUMBER_TYPE: Int
              val ANY_UNORDERED_NODE_TYPE: Int
              val BOOLEAN_TYPE: Int
              val FIRST_ORDERED_NODE_TYPE: Int
              val ORDERED_NODE_ITERATOR_TYPE: Int
              val ORDERED_NODE_SNAPSHOT_TYPE: Int
              val STRING_TYPE: Int
              val UNORDERED_NODE_ITERATOR_TYPE: Int
              val UNORDERED_NODE_SNAPSHOT_TYPE: Int
          }
      
          // Instance properties:
      
          val booleanValue: Boolean?
          val invalidIteratorState: Boolean
          val numberValue: Double?
          val resultType: Int
          val singleNodeValue: dynamic
          val snapshotLength: Int
          val stringValue: String?
      
          // Instance methods:
          fun iterateNext(): Node?
      
          fun snapshotItem(index: Int): Node?
      }
      
      
      fun Document.evaluate(
          xpathExpression: String,
          contextNode: Node,
          namespaceResolver: Any?,
          resultType: Any,
          result: Any?,
      ): XPathResult =
          asDynamic().evaluate(
              xpathExpression,
              contextNode,
              namespaceResolver,
              resultType,
              result
          ) as XPathResult
      

      【讨论】:

        猜你喜欢
        • 2020-12-06
        • 2018-10-25
        • 1970-01-01
        • 1970-01-01
        • 2021-10-29
        • 2018-10-16
        • 2023-03-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多