首页 > 解决方案 > 来自 xml 节点的 scala-xml 子方法获取尾随空格

问题描述

我实际上是在 Windows 上工作,我必须从文件中解析 xml。

问题是当我解析根元素并通过该child方法获取子元素时,我得到的是空子元素。

XML.load("my_path\\sof.xml").child

res0: Seq[scala.xml.Node] = List(
    , <b/>, 
)

这是我的 xml 文件

sof.xml
<a>
    <b></b>
</a>

但是当我像这样删除文件的每个 \n 和 \r 时:

sof.xml
<a><b></b></a>

我得到了以下预期的结果

res0: Seq[scala.xml.Node] = List(<b/>)

我的问题是,是否可以从预期的形式中正确读取它?

标签: scalascala-xml

解决方案


问题是换行符/空格被视为文本节点。该scala.xml.Utility.trim(x: Node)方法将删除不必要的空格:

scala> val a = XML.loadString("""<a>
     |     <b></b>
     | </a>""")
a: scala.xml.Elem =
<a>
    <b/>
</a>

scala> scala.xml.Utility.trim(a)
res0: scala.xml.Node = <a><b/></a>

请注意,如果元素之间有实际的 Text 节点,则这与 .collect 方法不同,例如:

scala> val a = XML.loadString("""<a>
     |    <b>Test </b>   Foo    
     |    </a>""")
a: scala.xml.Elem =
<a>
   <b>Test </b>   Foo
</a>

scala> scala.xml.Utility.trim(a).child
res0: Seq[scala.xml.Node] = List(<b>Test</b>, Test)

scala> a.child.collect { case e: scala.xml.Elem => e }
res1: Seq[scala.xml.Elem] = List(<b>Test </b>)

使用 .collect 方法,“Foo”字符串从子列表中排除。


推荐阅读