2013-06-28 2 views
0

Пытается извлечь данные между тегами с помощью Perl. К сожалению, синтаксические анализаторы здесь не являются опцией:Извлечь данные между тегами из файлов

  1. Мне нужно иметь стандартный код для работы со многими файлами в каталоге.
  2. Содержимое, которое мне нужно извлечь, отличается в разных файлах. Например: «Критерии включения» находятся в <P> в одном файле, <L> в другом и в <TD> в третьем.

Итак, у меня действительно нет выбора, кроме как использовать очень пушистый способ использования регулярных выражений для анализа файла и извлечения данных. Если у кого-то нет лучшей идеи ...

У меня есть код ниже, чтобы выполнить поиск и извлечение в файле.

Для данной фразы мне нужно извлечь содержимое под ним, которое может быть абзацем или списком <L>.

Так это то, что я делаю:

  • Открытие файла
  • Найти строку, содержащую фразу.
  • Проверьте, если следующая строка начинается с метки <L>, извлеките все (диапазон строк) между <L> и </LI> тегами.

Ниже приводится мой неполный код. Это ничего не возвращает. Итак, ища здесь какую-то помощь.

  1. Я нахожусь на правильном пути с этим?
  2. Как я могу извлечь все данные между <L> и </L> тегами и сохранить их в массиве для подсчета?

Отрывок кода:

if (($curr_line =~ m/\binclusion criteria\b/i) 
    && ($curr_line !~ m/\b....\b/) && ($curr_line !~ /^<Bookmark/)) 
{ 
    $nextline = <$CURR_FILE> 
    if ($next_line =~ /^<L/) 
    { 
     print "next line is a list\n"; 
     ## inclusion is a list..so extract everything from the list 
     my $start = "<LI>"; 
     my $end = "</L>";   
     while ($next_line =~ m{($start.*?$end)}gx) 
     { 
      print "List is...$next_line"; 

     }   

    }#inner if 
    } 

EDIT: Добавление входного XML фрагмент.

Итак, вот один из XML-файлов, созданных в формате PDF.

Мне нужно извлечь: «Это содержание цели исследования». Было бы легко, если бы только путь был согласован во всех документах. Здесь он находится под: //Sect//H4, а в других - под //Sect//H2 или //Sect//H1. Здесь нет никакой последовательности.

Также необходимо извлечь все перечисленные материалы в соответствии с критериями принудительной и эксклюзионной проверки. Тот же вопрос. Путь между документами не согласован.

Ссылки на закладки приводят к абзацу с несвязанным контентом.

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

<?xml version="1.0" encoding="UTF-8" ?>                
<TaggedPDF-doc> 
    <bookmark-tree> 
    <bookmark title="5.1.1 Inclusion criteria"> 
     <destination structID="LinkTarget_1130"/> 
    </bookmark> 
    <bookmark title="5.1.2 Exclusion criteria"> 
     <destination structID="LinkTarget_1131"/> 
    </bookmark> 
    </bookmark> 
    <Part> 
    <Sect> 
     <Sect> 
     <H4>2.1 Study purpose </H4> 
     <P>This is study purpose content</P> 
     </Sect> 
     <P id="LinkTarget_1130"> This is some unrelated paragraph </P> 
     <P>5.1.1 Inclusion criteria </P> 
     <L> 
     <LI> 
      <LI_Label>1. </LI_Label> 
      <LI_Title>Title 1</LI_Title> 
     </LI> 
     <LI> 
      <LI_Label>2. </LI_Label> 
      <LI_Title>Title 2 </LI_Title> 
     </LI> 
     </L> 
     <P>some content 1</P> 
     <P>some content 2</P> 
     <P>some content 3 </P> 
     <P>some content 4</P> 
     <P>some content 5</P> 
     <L> 
     <LI> 
      <LI_Label>4.</LI_Label> 
      <LI_Title>Title 4</LI_Title> 
     </LI> 
     <LI> 
      <LI_Label>5. </LI_Label> 
      <LI_Title>Title 5 
     </LI> 
     </L> 
     <P id="LinkTarget_1131"> This is some unrelated paragraph </P> 
     <P>5.1.2 Exclusion criteria </P> 
     <P>Some content 1</P> 
     <L> 
     <LI> 
      <LI_Label>1. </LI_Label> 
      <LI_Title>Title 1</LI_Title> 
     </LI> 
     <L> 
      <LI> 
      <LI_Label>2. </LI_Label> 
      <LI_Title>Title 2</LI_Title> 
      </LI> 
      <LI>(3) some content</LI> 
     </L> 
     <P>Some content </P> 
     </Sect> 
    </Sect> 
    </Part> 
</TaggedPDF-doc> 
+3

Итак, вместо того, чтобы использовать настоящий парсер, вам лучше взломать что-то *, потому что * это будет стандартным? –

+0

Пожалуйста, покажите краткую выборку каждого файла XML. Это может быть сделано без синтаксического анализатора. – simbabque

+3

Parsers здесь не вариант, синтаксический анализатор является решением здесь. –

ответ

1

Ваш запрос немного противоречивым, но я считаю, что это выражение XPATH как

(//Sect//H1 | //Sect//H2 | //Sect//H3 | //Sect//H4)[1]/following-sibling::* 

мог делать то, что вы хотите. При запуске на очищенную вверх версии вашего «XML», как

use strict; use warnings; use 5.010; use XML::LibXML; 

my $dom = XML::LibXML->load_xml(IO => \*DATA); # XML is in DATA file handle 

say $dom->findvalue('(//Sect//H1 | //Sect//H2 | //Sect//H3 | //Sect//H4)[1]/following-sibling::*'); 

выводит

This is study purpose content 
+0

Это может работать для данного значения. Но если бы я хотел извлечь: 5.1.1 критерии включения и все дети под ним динамически, как бы я знал, где остановиться? Мне нужно всего лишь восстановить все между

5.1.1 Критерии включения

и

5.1.2 Критерии включения

BRZ

+1

@simak Затем вы должны разместить больше примеров (удаление ненужных строк) –

2

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

Очевидно, что если у данных нет никакого рисунка, вы не сможете извлечь что-либо полезное, независимо от используемого вами языка программирования. Но вы должны подумать, что есть какой-то образец, иначе вы не будете пытаться выполнить эту задачу. Поэтому вам нужно сказать нам, что это за образец. Например, если вы хотите, первый следующий элемент после первого элемента, имя которого начинается с «Н», что бы

//*[starts-with(name(), 'H')][1]/following-sibling::*[1] 

Независимо правило, если вы можете выразить это на английском языке, то вы можете выразить это в XPath (или если ситуация становится очень сложной, в XSLT или XQuery).

Откровенно говоря, я думаю, что ваши трудности здесь в том, что вы пытаетесь взломать его кодом, когда вы не задумывались о том, какие правила вы пытаетесь реализовать. Это обречено на провал на любом языке программирования.

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