2010-03-03 80 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轉換)

相關問題