【问题标题】:How do I create an XML root node in Scala without a literal element name?如何在没有文字元素名称的情况下在 Scala 中创建 XML 根节点?
【发布时间】:2011-01-29 11:04:16
【问题描述】:

我正在寻找这样的文档:

<root/>

我可以以编程方式添加孩子。从理论上讲,它应该是这样的:

val root_node_name = "root"
val doc = <{root_node_name}/>

但这似乎不起作用:

error: not found: value <

所以,我尝试的是这样的:

val root_node_name = "root"
val doc = new scala.xml.Elem(null, root_node_name, null, scala.xml.TopScope, null)  

编译但在运行时我得到这个空指针异常:

java.lang.NullPointerException
at scala.xml.Utility$.toXML(Utility.scala:201)
at scala.xml.Utility$$anonfun$sequenceToXML$2.apply(Utility.scala:235)
at scala.xml.Utility$$anonfun$sequenceToXML$2.apply(Utility.scala:235)
at scala.Iterator$class.foreach(Iterator.scala:414)
at scala.runtime.BoxedArray$AnyIterator.foreach(BoxedArray.scala:45)
at scala.Iterable$class.foreach(Iterable...

我使用的是 Scala 2.8。有什么例子可以说明如何做到这一点?谢谢。

【问题讨论】:

    标签: xml scala scala-2.8


    【解决方案1】:

    您应该传递属性的空列表 (scala.xml.Null),如果您不想要任何孩子,您甚至不应该包含最后一个参数。您想要一个空的孩子列表,而不是恰好是 null 的单个孩子。所以:

    scala> val root_node_name = "root"
    root_node_name: java.lang.String = root
    
    scala> val doc = new scala.xml.Elem(null, root_node_name, scala.xml.Null , scala.xml.TopScope)
    doc: scala.xml.Elem = <root></root>
    

    【讨论】:

    • 现在运行时带有弃用警告。
    • 使用当前 API (Scala.xml 2.11.x):val doc = Elem.apply(null, root_node_name, scala.xml.Null, scala.xml.TopScope)
    【解决方案2】:

    在 2.8 上你可以这样做:

    scala> val r = <root/>
    r: scala.xml.Elem = <root></root>
    
    scala> r.copy(label="bar")
    res0: scala.xml.Elem = <bar></bar>
    

    因此,如果您的初始文档是&lt;root/&gt;,则只需使用文字即可。如果你需要能够在运行时设置标签,你可以定义一个这样的方法:

    def newRoot(label:String) = {val r = <root/>; r.copy(label=label) }
    

    【讨论】:

      猜你喜欢
      • 2012-07-21
      • 1970-01-01
      • 1970-01-01
      • 2010-09-24
      • 2012-06-12
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多