Scala - Как извлечь файл XML, включенный в общий текстовый файл - PullRequest
0 голосов
/ 29 января 2019

У меня есть очень специфический (и странный) текстовый файл, который не является XML-файлом, но содержит XML-документ.Его структура более или менее такова:

Some text that I am not interested in...
More text that I don't need.

<tagIWant>
   <...>
   <!-- A large XML document -->
   <...>
</tagIwant>

Some more text...

Я хотел бы проанализировать этот текстовый файл в Scala и извлечь XML-файл из <tagIWant> до </tagIWant>.Я знаю, что синтаксический анализатор XML очень мощный в Scala, но, очевидно, его нельзя анализировать как XML.

Ответы [ 3 ]

0 голосов
/ 29 января 2019

Вероятно, лучше предварительно обработать файл, чтобы удалить биты, отличные от XML, прежде чем передавать его в анализатор XML.Этот код удалит все начальные и конечные строки, которые не имеют ничего похожего на тег XML:

val isTag = "<[^>]+>".r
val xml =
  text.split("\n")
    .dropWhile(isTag.findFirstMatchIn(_).isEmpty)
    .reverse
    .dropWhile(isTag.findFirstMatchIn(_).isEmpty)
    .reverse
    .mkString("\n")

Вы можете заменить text.split("\n") любым кодом, который читает текстовый файл в виде списка * 1005.* values.

Предполагается, что открывающий тег - это первый текст в строке, а закрывающий тег - последний текст в строке.

0 голосов
/ 01 февраля 2019
val text = """
Some text that I am not interested in...
More text that I don't need.

<tagIWant>
   <qqq>
   <!-- A large XML document -->
   </qqq>
</tagIWant>

Some more text...
"""

val pattern = "(?s).*(<tagIWant>.*</tagIWant>).*".r
val xml = pattern.findFirstMatchIn(text).map(m => m.group(1)).map(x => scala.xml.XML.loadString(x))

Результат - Option[scala.xml.Elem], содержащий ваш XML или None.

Также рассмотрите возможность использования pattern.findAllMatchIn.

0 голосов
/ 29 января 2019

Один из подходов, который МОЖЕТ сработать (в терминах Java вам придется переводить в Scala), состоит в том, чтобы предоставить вход для парсера из вашего собственного Reader, использовать выходные данные парсера в SAX ContentHandler и получить обратную-канал от ContentHandler к Reader, так что, как только о событии endElement для самого внешнего элемента сообщается, он сообщает Reader о прекращении подачи ввода.

Причина, по которой он может не работать, заключается в том, что анализатор может буферизоватьот читателя, поэтому к тому времени, когда ваш ContentHandler скажет Reader прекратить, уже слишком поздно.

Обидно, что анализаторы XML не имеют возможности остановить синтаксический анализ без ошибок при обнаружении закрытияконец тега, но если есть парсер с этой опцией, я не встречал его.Вы всегда можете попробовать изменить парсер с открытым исходным кодом!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...