2016-01-04 2 views
0

Когда я прочитал XML-файл/строку как NodeSeq, как получить имя корневого элемента?Анализ XML как NodeSeq, как читать имя корневого элемента?

Кажется, что это простой, но я не вижу сразу очевидного способа сделать это, глядя на NodeSeq API.

Минимальный пример:

Учитывая произвольный XML:

<HelloWorld> 
    <Foo>Bar</Foo> 
</HelloWorld> 

И код, который загружает его как NodeSeq:

val xml: NodeSeq = XML.loadString(xmlString) 

Что самый простой способ получить имя корневого элемента, в этот случай "HelloWorld"?

ответ

1

Вы можете получить первый Node используя head или headOption, а затем получить имя с помощью Node.label:

import scala.xml.XML 

val nodes = XML.loadString(""" 
    <HelloWorld> 
    <Foo>Bar</Foo> 
    </HelloWorld> 
""") 

val label = nodes.head.label // String: HelloWorld 

И, как Dylan pointed out, XML.loadString фактически возвращает Elem, поэтому самый простой способ получить корень имя элемента является:

XML.loadString(xmlString).label 
+0

Спасибо! Поскольку хорошо сформированные документы XML всегда имеют один корневой элемент, 'foreach' выглядит немного странно; Я бы, вероятно, пошел с 'val rootName = nodes.headOption.map (_. Label) .get' – Jonik

+0

Если вы уверены, что ваш XML-документ имеет корневой элемент, вы можете сделать' nodes.head.label'. ('foreach' - это просто простой способ выполнить функцию побочного эффекта на' Option'). –

+0

XML.loadString() выдает исключение SAXParseException, если вы передаете строку, которая не является правильно сформированным XML, так что да, я уверен. :) (Просто попробовал его с пустой строкой, произвольной не-XML-строкой и строкой XML с несколькими корневыми узлами.) Таким образом, здесь «headoption» просто усложняет код без необходимости, и, действительно, «head.label» - это способ пойти , Можете ли вы обновить ответ? – Jonik

Смежные вопросы