简体   繁体   English

Kotlin Multiplatform/JS 未解决的引用 Document.evaluate()

[英]Kotlin Multiplatform/JS Unresolved reference Document.evaluate()

Context: Kotlin Multiplatform JavaScript .上下文: Kotlin 多平台 JavaScript

I'm trying to use a Document.evaluate() but getting Unresolved reference: evaluate and Unresolved reference: XPathResult .我正在尝试使用Document.evaluate()但得到Unresolved reference: evaluateUnresolved 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)
    }
}

build.gradle.kts build.gradle.kts

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

   sourceSets {
      val jsTest by getting
   }

As far as I know there is no bindings for XPathEvaluator interface out of the box right now.据我所知,目前没有开箱即用的XPathEvaluator接口绑定。 But you could add them by yourself using asDynamic :但是您可以使用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)

As an alternative to @Evgeny solution, you can also use this class which is marked as external as suggested in Use JavaScript code from Kotlin作为@Evgeny 解决方案的替代方案,您还可以使用此标记为external的 class,如使用来自 Kotlin 的代码 JavaScript中所建议的

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM