дочерний метод scala-xml из узла xml получает пробельные пробелы - PullRequest
0 голосов
/ 25 октября 2018

Я на самом деле работаю с Windows, и мне нужно разобрать xml из файла.

Проблема в том, что когда я анализирую корневой элемент и получаю детей с помощью метода child, я получаю пустоеchildren.

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/>)

У меня вопрос, есть ли возможность прочитать его правильно из предполагаемой формы?

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Проблема в том, что символы новой строки / пробелы обрабатываются как текстовые узлы.Метод 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>

Обратите внимание, что это отличается от метода .collect, если у вас есть фактические узлы Text между элементами, например:

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" исключена из списка детей.

0 голосов
/ 25 октября 2018

Я проверил это на Mac:

XML.loadString("""<a>
                   |    <b></b>
                   |</a>""").child

Это приводит к тому же самому поведению - которое я тоже не понимаю.

Однако это может исправить это в вашем коде:

XML.loadString("""<a>
                   |    <b></b>
                   |</a>""").child
  .collect{ case e: Elem=> e}

Это исключит xml.Text с.

...