从html文件中获取数据会产生一些随机值

时间:2019-03-28 09:38:52

标签: html regex xml perl grep

我有一个XML文件,使用该文件我根据一些正则表达式获取了一些值。 XML文件看起来像这样-

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

我想从“ SomeAddr”标签中检索17'h00baf值。我正在匹配正则表达式“ 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。在类似的方法上,我能够grep其他值为十进制或字符串的值,仅使用十六进制值时,我会遇到此问题。有人可以告诉我该方法有什么问题吗?

2 个答案:

答案 0 :(得分:4)

请不要使用正则表达式解析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>标签。)

答案 1 :(得分:2)

Never, ever use a regex to parse HTML/XML/...。始终使用正确的解析器,然后在DOM域中实现算法。

我的解决方案展示了如何解析XML,然后从XML文档顶层的<SomeAddr>节点提取文本内容。

#!/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