我试图从XML文件中解析/提取数据并检索必要的数据。
例如:
<about>
This is an XML file
that I want to
extract data from
</about>
<message>Hello, this is a message.</message>
<this>Blah</this>
<that>Blahh</that>
<person>
<name>Jack</name>
<age>27</name>
<email>jack@gmail.com</email>
</person>
我无法在<about>
代码中获取内容。
这是我到目前为止所做的:
(<\w*>)[\s*]?([\s*]?.*)(<\/\w*>)/m
我只是想提取标签名称和内容,这就是我在那里有括号的原因。即($tag = $1) =~ s/[<>]//
获取标记名称$tagcontent = $2
以获取标记的内容。我使用\s
表示空白字符(空格,制表符,换行符)和?
,因为它可能会也可能不会发生*
次数。
我是通过http://www.regexe.com/对此进行测试的,并且没有运气匹配。
感谢任何帮助。提前谢谢!
答案 0 :(得分:4)
XML不是常规语言,无法使用正则表达式进行准确解析。请改用XML解析器。这保证适用于所有情况,并且如果标记的格式在将来发生变化,则不会中断。
但是,如果您完全确定格式,那么可以使用以下正则表达式:
/<(\w+)>\s*(.*?)\s*<\/\1>/s
说明:
/
- 开始分隔符<(\w+)>
- 开场标记\s*
- 匹配(.*?)
- 匹配标记内的内容\s*
- 匹配<\/\1>
- 匹配结束标记。 \1
这里是一个反向引用,其中包含第一个捕获组匹配的内容。/
- 结尾分隔符请注意,s
修饰符和m
修饰符完全不同,并执行不同的操作。有关每项操作的详细信息,请参阅this answer。
答案 1 :(得分:4)
我建议你不要尝试使用正则表达式来解析XML,而是使用实际的XML Parser。
以下使用XML::LibXML
显示“about”节点中的文本。但是,另一个优秀的框架是XML::Twig
。
use strict;
use warnings;
use XML::LibXML;
my $xml = XML::LibXML->load_xml(IO => \*DATA);
my $about = $xml->findvalue('//about');
print $about, "\n";
__DATA__
<root>
<about>
This is an XML file
that I want to
extract data from
</about>
<message>Hello, this is a message.</message>
<this>Blah</this>
<that>Blahh</that>
<person>
<name>Jack</name>
<age>27</age>
<email>jack@gmail.com</email>
</person>
</root>
输出:
This is an XML file
that I want to
extract data from