如何从无前缀的名称空间标记读取Scala Scales XML中的属性
我正在使用scalexml和Scala 我正在尝试读取MediaWiki XML格式,它是这样开始的:如何从无前缀的名称空间标记读取Scala Scales XML中的属性,xml,scala,Xml,Scala,我正在使用scalexml和Scala 我正在尝试读取MediaWiki XML格式,它是这样开始的: <mediawiki xmlns="http://www.mediawiki.org/xml/export-0.8/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.8/ http://www.mediawiki
<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.8/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.8/ http://www.mediawiki.org/xml/export-0.8.xsd" version="0.8" xml:lang="en">
然后在标签下面有一堆标签,其中一些有重定向标签,例如:
<page>
<title>Albigensian</title>
<redirect title="Catharism" />
<revision>
...
</revision>
</page>
阿尔比根阶
...
我正在使用ScalesXML进行解析:
object WikiMediaImport extends App with Logging {
val xml = pullXml(new FileReader(args(0)))
val ns = Namespace("http://www.mediawiki.org/xml/export-0.8/")
val p = ns // .prefixed("mediawiki") <-- that doesn't help either
val mediawikiTag = p("mediawiki")
val pageTag = p("page")
val titleTag = p("title")
val revisionTag = p("revision")
val textTag = p("text")
val timestampTag = p("timestamp")
val redirectTag = p("redirect")
//val redirectWhereAttr: Attribute = Attribute(redirectTag, "title")
val pagePath = List(mediawikiTag, pageTag)
val iterator = iterate(pagePath, xml)
for {
page <- iterator
} {
val title = text(page \* titleTag)
val timestamp = text(page \* revisionTag \* timestampTag)
val content = text(page \* revisionTag \* textTag)
println(s"$title $timestamp ${content.length}")
}
}
对象WikiMediaImport通过日志扩展应用程序{
val xml=pullXml(新文件读取器(args(0)))
val ns=名称空间(“http://www.mediawiki.org/xml/export-0.8/")
val p=ns/.前缀(“mediawiki”)找到了答案,需要使用带有简单字符串的*@
运算符来访问属性:
val redirectWhereAttr = "title".l
...
val redirectWhere = text(page \* redirectTag *@ redirectWhereAttr)
访问属性需要AttributeQName(非命名空间QName或前缀QName)。简单字符串版本的*@仅在localName上进行比较,我会反对这是一个错误,正如UnfixedQName重载版本一样。它们有助于简化查询的构建,但它们不符合规范类型,并且可能会在以后咬人(包括我)
\@name是一个非mespaceqname(正如上面的重定向标题属性一样)。\@p:name是一个前缀qname,唯一的其他指定方法是通过谓词,scales也应该这样做
编辑以添加实际的“以后不要弃用”答案,抱歉:)-由于此属性没有名称空间,您应在字符串上使用“l”函数,或直接通过NoNamespaceQName(localString)创建NoNamespaceQName使用它。Chris,谢谢你的回答,但是你能详细说明我在这种特殊情况下应该写什么吗(使用名称空间,但没有前缀)?