【问题标题】: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