2010-03-03 23 views
0

我有一个大的XML,看起来像这样:正则表达式:把一切都在<profession></profession>标签

<gender>M</gender> 
<last-name>*</last-name> 
<profession>2165dda2-dc59-41af-acb5-06d8914c4841</profession> 
<first-name>*</first-name> 
<mail-confirmation>1</mail-confirmation> 
<fax-confirmation>1</fax-confirmation> 

我只是想保持标签。我找到了一种方法来搜索标签,就像这样:

<profession[^>]*>([^<]*?)</profession> 

但如何寻找在它之外的一切吗?我想只是将其翻转,如:

</profession[^>]*>([^<]*?)<profession> 

</profession>([^<]*?)<profession[^>]*> 

,但是这是行不通的。

+0

你究竟想达到什么目的?只需获取这些标签中的数据?只有外面的数据?只是去掉这些标签? – Oded 2010-03-03 15:36:11

+0

确切地说;我只想要专业标签内的数据。剩下的就要走了。 – skerit 2010-03-03 15:37:49

+0

“我如何使用正则表达式来解析XML/HTML”已被无数次询问 – erikkallen 2010-03-03 15:56:45

回答

1

严格地说,你不能用正则表达式来解析XML。

与sed的快速和肮脏的解决办法是用grep同行业的线,然后用“替换“专业” 和“/专业””(标记被剥离<>)

+0

快速简单的grep,我没有想到! – skerit 2010-03-03 16:03:30

+0

如果行尾可以出现在标签内,则必须小心 – user280760 2010-03-03 18:11:06

0

什么

# Perl 
$xml =~ s/^<profession>.*<\/profession>$/<profession><\/profession>/m; 

只要确保使用多修改。

+0

我没有真正使用perl。我坚持使用notepad ++的正则表达式功能。或sed。 – skerit 2010-03-03 15:48:48

+0

@skerit那么你没有编程问题,是吗? – 2010-03-03 15:53:47

+0

我有一个关于某个正则表达式的问题,它与询问有关特定SQL查询的内容是一样的。 – skerit 2010-03-03 15:56:35

1

不要使用正则表达式来解析XML。使用XML解析器:

#!/usr/bin/perl 

use strict; use warnings; 

use XML::LibXML::Reader; 

my $reader = XML::LibXML::Reader->new(IO => \*DATA) 
    or die "Cannot read from \\*DATA\n"; 

while ($reader->read) { 
    print $reader->readInnerXml if $reader->localName eq 'profession'; 
} 

$reader->finish; 
print $reader->document->toString(1); 

__DATA__ 
<person> 
<gender>M</gender> 
<last-name>*</last-name> 
<profession>2165dda2-dc59-41af-acb5-06d8914c4841</profession> 
<first-name>*</first-name> 
<mail-confirmation>1</mail-confirmation> 
<fax-confirmation>1</fax-confirmation> 
</person> 

输出:

C:\Temp> t 
2165dda2-dc59-41af-acb5-06d8914c4841

XML::LibXML::Reader

1

你可能会考虑使用XSL来选择价值。例如,从您的XML中创建一个以逗号分隔的专业列表。

<xsl:stylesheet version='2.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'> 
    <xsl:output method="text" /> 
    <xsl:template match='/'> 
     <xsl:for-each select="person"> 
      <xsl:value-of select="profession" /><xsl:text>,</xsl:text> 
     </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

记事本++有一个XML插件,可以针对打开的文件运行XSL。 (插件> XML工具> XSL转换)

相关问题