我实际上正在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/>)
我的问题是,是否可以选择从预期形式正确读取它?
答案 0 :(得分:2)
问题是换行符/空格被视为“文本”节点。 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”字符串将从子级列表中排除。
答案 1 :(得分:1)
我在Mac上对此进行了检查:
XML.loadString("""<a>
| <b></b>
|</a>""").child
这会导致相同的行为-我也不明白。
但这可以在您的代码中解决此问题:
XML.loadString("""<a>
| <b></b>
|</a>""").child
.collect{ case e: Elem=> e}
这将消除xml.Text
。