2017-04-19 76 views
0

我需要打印帶有點的XML標記。 例如:bg.tres,resume.pr 下面是我試過的代碼,但它在第一次匹配後停止。我試圖首先提取標籤,然後確定標籤中有點。Perl腳本遍歷XML標記並列出所有標記點的標記

my $xml = q~<?xml version='1.0'?> 
<bg.tres> 
<resume.key='267298871' score='5'> 
    <xpath path='xpath://resume'> 
    <resume.pr canonversion='2' dateversion='2' present='734060'> 
    </resume.pr> 
    </xpath> 
</resume> 
</bg.tres>~; 

#print $xml,$/; 
foreach $line($xml) 
{ 
    if($line =~ m/<(.*?)>/) 
    { 
     print "$1\n"; 
    } 
} 

誰能請審查,因爲所有的例子都存在與封裝和模塊的使用,但我需要用簡單的邏輯執行它,而功能。沒有這樣的例子,請建議。

+1

使用XML解析器 –

+0

兩個問題:1)這不是XML。 b)如果它是XML,用正則表達式解析它並不重要,因爲XML是上下文的,正則表達式不是。 c)有些模塊是XML解析器。你應該使用一個。 – Sobrique

+0

這看起來不像格式良好的XML?您是否考慮過使用格式良好的XML和XML解析器? – Doqnach

回答

-1

在@xml中,你只有一行,所以你的正則表達式不能工作。

你需要拆分你的字符串。

重命名@xml在$ XML,然後

my @xml = split(/\n/,$xml); 

if ($line =~ m/<([^>]+(?=\.)[^>]+)>/) 

此代碼的工作對我來說:

my $xml = q~<?xml version='1.0'?> 
<bg.tres> 
<resume.key='267298871' score='5'> 
    <xpath path='xpath://resume'> 
    <resume.pr canonversion='2' dateversion='2' present='734060'> 
    </resume.pr> 
    </xpath> 
</resume> 
</bg.tres>~; 


#print $xml,$/; 
my @xml = split(/\n/,$xml); 

foreach $line(@xml) 
{ 
    if($line =~ m/<([^>]+(?=\.)[^>]+)>/) 
    { 
     print "$1\n"; 
    } 
} 
+0

現在它的工作,但正則表達式如果($行=〜m/<(.*?)> /)比if($ line =〜m/<([^>)+(?= \)更準確地工作。)[^>] +)> /),因爲標記xpath從輸出中丟失。謝謝:) –

+0

有趣!用你的正則表達式,我得到了:?xml version ='1.0'? bg.tres resume.key ='267298871'score ='5' xpath path ='xpath:// resume' resume.pr canonversion ='2'dateversion ='2'present ='734060' /resume .pr /xpath /resume /bg.tres 它與您的請求「具有點的XML標記」不匹配。 – Plaute

2

有一對夫婦與您的要求的問題:

  1. 這不是XML。如果這真的是你的源XML,我建議你去打一個XML規範的捲髮副本給你。因爲畸形的XML是應該是致命的

  2. XML是上下文的。正則表達式不是。因此用正則表達式解析XML非常複雜(這不是相當於不可能,但很難)。

  3. xpath是正則表達式的XML等價物。有點。它是上下文的,允許您根據XML結構進行選擇和匹配,區分內容,標籤和屬性。

  4. 解析器使工作變得簡單。使用解析器。

  5. 您正在將文本插入數組@xml,但它是單個值。所以不要使用標量。 foreach @xml沒有做你認爲正在做的事情,因爲@xml中只有一個元素。

所以考慮到這一點 - 和修復您的XML少是需要使它有效的XML:

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

use XML::Twig; 

my $src = q~<?xml version='1.0'?> 
<bg.tres> 
<resume.key key='267298871' score='5'> 
    <xpath path='xpath://resume'> 
    <resume.pr canonversion='2' dateversion='2' present='734060'> 
    </resume.pr> 
    </xpath> 
</resume.key> 
</bg.tres>~; 

my $xml = XML::Twig -> parse ($src); 

foreach my $node ($xml -> get_xpath ('//*')) { 
    print $node -> tag,"\n" if $node -> tag =~ m/\./; 
} 
+0

實際需求是這樣的,我有一個XML文件,並且必須列出所有具有(。)圓點的標籤,而不使用構建函數中的分析器或任何XML。所以我試着通過正則表達式來做。但正如你所提到的那樣,它的難以置信的複雜性,你能否提出任何簡單的邏輯,如使用字符串函數或其他任何東西,而不是解析器。 –

+0

不。沒有'簡單的邏輯',因爲XML不是那麼簡單。對於需要解析器的事物不使用解析器,意味着您需要自己編寫解析器。所以......也許去看看XML :: Twig的源代碼吧? (提示:它也非常複雜) – Sobrique

+1

您是說需要在沒有XML解析器的情況下處理XML?這有點像沒有扳手擰緊螺母的要求。要求用錯誤的工具做某件事是你應該離開的要求。 –