Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从无前缀的名称空间标记读取Scala Scales XML中的属性_Xml_Scala - Fatal编程技术网

如何从无前缀的名称空间标记读取Scala Scales 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

我正在使用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.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,谢谢你的回答,但是你能详细说明我在这种特殊情况下应该写什么吗(使用名称空间,但没有前缀)?