2013-03-18 30 views
0

我正在處理一個XML文檔,我需要打開它並在同一行上轉換爲大寫的一些特定標記值。如果我有相同的字,只負責替代其中的一個,雖然我使用的循環,如果兩個不同的: 這是我的XML:如何在同一個xml行中使用Perl替換相同的單詞?

<pageID="1" width="827" height="1169" Sender_Company="société" Sender_Address="société" Sender_Fax="" Category="C2" Language_2="" Document_Object="" Language_1="french" Language_3="" NumPage="1" Script_1="typed"> 

這是我的代碼:

while (<FILEIN>) { 
    if ($_ =~ /pageID="1"/) { 
     $haschanged = 1; 
     if ($_ !~ /Sender_Address=""/) { 
      if ($_ =~ /(Sender_Address="(.*?)")/){ 
       my $SenderAddress = $2; 
       $SenderAddress = uc($SenderAddress); 
       $_ =~ s/$1/Sender_Address="$SenderAddress"/; 
      } 
     } 

     if ($_ !~ /Sender_Company=""/) { 
      if ($_ =~ /(Sender_Company="(.*?)")/) { 
       my $SenderCompany = $2; 
       $SenderCompany = uc($SenderCompany); 
       $_ =~ s/$1/Sender_Company="$SenderCompany"/; 
       #print "$_\n"; 
      } 
     } 
    } 
} 

當我使用兩個不同的值Sender_Company="bla"Sender_Address="société"轉換爲大寫作品,但是當我在這種情況下使用相同的單詞Sender_Company="société"Sender_Address="société"它不會將轉換爲大寫。 有沒有人有任何想法?我無法找到它背後的邏輯,當我一次使用兩個不同的if循環時,不想轉換同一個單詞。謝謝!

+0

感謝您的代碼正確縮進。這會幫助你發現一般問題,主要是當你尋求幫助時,這對讀者是一種尊重。 – 2013-03-18 12:00:38

+0

它適合我。 – Toto 2013-03-18 12:13:34

+2

使用XML解析器來處理XML。 – Mat 2013-03-18 12:22:38

回答

2

你的XML的理解是有點值得商榷:

  1. 這不是XML。這是最多(元素不是封閉的,標籤名稱不能兼作屬性像<pageID="1">,沒有<?xml ...?>聲明,沒有根元素,...)
  2. 不要用正則表達式;-)
  3. XML解析XML的XML片段沒有「線條」的概念。

除此之外,代碼應該工作正常。做筆記,你可以讓你的生活簡單,你的代碼簡稱:

  1. $_ =~ /foo/相同/foo/$_ !~ /foo/是一樣的!/foo/
  2. 而是提取兩次捕獲,並在第二代正則表達式的結果,你可以做到這一切只需一個步驟:

    s{ (?<=Sender_Address=") ([^"]+) (?=") }{ uc $1 }ex 
    

    等等,什麼?我提取了一個或多個非「 - 」字符,後面跟着字符串Sender_Address=",後面跟着"(環視斷言),我捕獲它之間的東西,並用一個大寫版本代替它,因爲我匹配至少一個字符,我不必測試空標記的情況下/e標誌允許替換代碼(這裏不是真的需要),並且/x允許我們包含不匹配的空白以獲得更好的格式化

    您可以輕鬆地擴展這兩個屬性,你想要大寫:

    # This subsumes your whole logic inside `if (/pageID="1"/)` 
    $haschanged = 1; 
    for my $attr (qw/Sender_Address Sender_Company/) { 
        s{ (?<=\Q$attr\E=") ([^"]+) (?=") }{ uc $1 }ex; 
    } 
    

    \Q...\E導致刑警組織即使它包含的字符將是正則表達式元字符,否則。

還有一些剩餘的錯誤:

  1. 你不能大寫所給出的實體字符。
  2. XML允許將單引號'...'用作標記值分隔符。你不處理他們
  3. 參見下你的XML認識的點...

所有這些都可以通過使用XML解析器,然後轉化的DOM屬性來解決。

相關問題