Извлечение данных из html-файла дает случайное значение - PullRequest
0 голосов
/ 28 марта 2019

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

<Instance>Fuse_Name</Instance>
<Id>8'hed</ID>
<SomeAddr>17'h00baf</SomeAddr>
<PSomeAddr>17'h00baf</PSomeAddr>

Я хочу получить значение 17'h00baf из тега "SomeAddr". Я сопоставляю регулярное выражение "SomeAddr", чтобы достичь этой строки в файле, а затем использую функцию index и substr. Я получаю значение, используя приведенный ниже код

my $i = index($row,">");
my $j = index($row,"<"); 
$Size_in_bits = substr $row,$i+1,$j-$i-3;

Но после этого я не получаю 17'h00baf. Вместо этого я получаю 17'h01191. При аналогичном подходе я могу получить другие значения, которые являются десятичными или строковыми, только с шестнадцатеричными значениями, с которыми я сталкиваюсь. Может кто-нибудь сказать, пожалуйста, что не так в подходе?

Ответы [ 2 ]

4 голосов
/ 28 марта 2019

Пожалуйста, не анализируйте XML с помощью регулярных выражений. Используйте правильный синтаксический анализатор XML.

Но, временно игнорируя этот совет, я не понимаю поведение, которое вы описываете при тестировании вашего кода.

#!/usr/bin/perl

use strict;
use warnings;
use feature 'say';

while (<DATA>) {
  next unless /<SomeAddr>/;

  my $i = index($_, ">");
  my $j = index($_, "<");
  my $Size_in_bits = substr $_, $i + 1, $j - $i - 3;
  say $Size_in_bits;
}

__END__
<Instance>Fuse_Name</Instance>
<Id>8'hed</ID>
<SomeAddr>17'h00baf</SomeAddr>
<PSomeAddr>17'h00baf</PSomeAddr>

И запустить его:

$ perl parsexml
17'h00baf

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

(Полагаю, в файле есть еще один тег <SomeAddr>.)

2 голосов
/ 28 марта 2019

Никогда, никогда не используйте регулярные выражения для анализа HTML / XML /.... Всегда используйте правильный анализатор и затем реализуйте свой алгоритм в домене DOM.

Мое решение показывает, как анализировать XML, а затем извлекать текстовое содержимое из узлов <SomeAddr> на верхнем уровне документа XML.

#!/usr/bin/perl
use warnings;
use strict;

use XML::LibXML;

my $doc = XML::LibXML->load_xml(IO => \*DATA);
my $xpc = XML::LibXML::XPathContext->new();

# register default NS
$xpc->registerNs('default', 'http://some.domain.com/some/path/to');

foreach my $node ($xpc->findnodes('//default:SomeAddr', $doc)) {
    print $node->textContent, "\n";
}

exit 0;

__DATA__
<Root xmlns="http://some.domain.com/some/path/to">
  <Instance>Fuse_Name</Instance>
  <Id>8'hed</Id>
  <SomeAddr>17'h00baf</SomeAddr>
  <PSomeAddr>17'h00baf</PSomeAddr>
</Root>

Тестовый прогон

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