方法返回NodeBuffer而不是Elem,这违反了类型检查规则

アレッ*_*ックス 3 xml scala

有两种方法,都返回xml:

 def method1 = 
   <?xml version="1.0" encoding="utf-8"?>
    <soap:Envelope>
      <soap:Header>
        {Elem(....)}
      </soap:Header>
    </soap:Envelope>

 def method2 = 
  <someXml>
    //.......
  </someXml>
Run Code Online (Sandbox Code Playgroud)

还有一种方法可以获得Elem:

def method3(a: Elem) = //....

val xml1 = method1
val xml2 = method2

method3(xml1) //error
method3(xml2) //ok
Run Code Online (Sandbox Code Playgroud)

它说method1回报NodeBuffer并且不能接受它,而method2回报则Elem完全没问题.

这是为什么?我该怎么办?

sen*_*nia 5

scala> def method1 = <?xml version="1.0" encoding="utf-8"?><root />
method1: scala.xml.NodeBuffer
Run Code Online (Sandbox Code Playgroud)

method1你要创建一个不xmlXML declaration,但2个NodeS:处理指令(斯卡拉型ProcInstr)和Elem:

scala> <?abc attr1="v1" attr2="v2" ?>
res0: scala.xml.ProcInstr = <?abc attr1="v1" attr2="v2" ?>
Run Code Online (Sandbox Code Playgroud)

2个点头的序列为您提供了一组节点 - NodeBuffer:

scala> <a/><b/>
res0: scala.xml.NodeBuffer = ArrayBuffer(<a/>, <b/>)
Run Code Online (Sandbox Code Playgroud)

实际上你不能xml手动使用处理指令:

scala> <?xml version="1.0" encoding="utf-8"?>
java.lang.IllegalArgumentException: xml is reserved
Run Code Online (Sandbox Code Playgroud)

只需删除它.

如果您需要序列化版本的XML声明,则应使用XML.writeXML.save使用xmlDecl = true:

import xml.XML
val myXml = <root />
val writer = new java.io.StringWriter
XML.write(writer, myXml, "utf-8", xmlDecl = true, doctype = null)
writer.toString
// <?xml version='1.0' encoding='utf-8'?>
// <root/>
Run Code Online (Sandbox Code Playgroud)