Извлечение имен элементов и значений свойств из XML - PullRequest
2 голосов
/ 21 июля 2011

Я относительно новичок в работе со Scala, поскольку недавно пришел из Java.

Я ищу совет по созданию эффективных средств чтения XML-файла и извлечения имен и свойств элементов, содержащихся вгде данные заключены в круглые скобки.

Например,

<какое-то имя> {свойство} <некое имя />

Таким образом, ключгде есть данные, содержащиеся в {}

Затем я хочу заполнить хеш-карту фактическими именами элементов и значениями свойств, содержащимися между {} .

Я уверен, что это не слишком сложно, но, учитывая мой ограниченный опыт работы с Scala, я хотел бы отослать этот вопрос к опыту форума.

Большое спасибо всем, кто нашел время ответить.

1 Ответ

0 голосов
/ 21 июля 2011

[ОБНОВЛЕНО] Только что понял, что вы спрашивали о фигурных скобках в тексте, а не о синтаксических скобках, связанных с XML. Возможный ответ:

scala> val xml = <a>
                   <prop>{{key1}}</prop>
                   <prop>{{key2}}</prop>
                   <prop>notkey</prop>
                 </a>
xml: scala.xml.Elem = <a><prop>{key1}</prop><prop>{key2}</prop><prop>notkey</prop></a>

Я удвоил { и }, чтобы избежать скобок, потому что Scala рассматривает { переменную } как замену:

scala> val text="all your base are belong to us"
text: java.lang.String = all your base are belong to us

scala> val template = <a>{text}</a>
template: scala.xml.Elem = <a>all your base are belong to us</a>

Теперь вернемся к работе.
Чтобы взять только prop's, используйте \ оператор проекции, который принимает подузлы с заданным именем. Чтобы взять все вложенные узлы в дереве xml, используйте \\.

scala> val props = xml\"prop"
props: scala.xml.NodeSeq = NodeSeq(<prop>{key1}</prop>, <prop>{key2}</prop>, <prop>notkey</prop>)

val keys = props.filter (p => p.text.startsWith("{"))
res3: scala.xml.NodeSeq = NodeSeq(<prop>{key1}</prop>, <prop>{key2}</prop>)

На самом деле, меня здесь обманывают, и я предполагаю, что поле нежелательного свойства не может существовать в форме {notkey . Вы можете переписать код для фильтрации ключей другим способом (например, используя регулярные выражения)

scala> for(k <- keys) {
     | println(k.label+":"+k.text)
     | }
prop:{key1}
prop:{key2}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...