2016-10-29 33 views
0

我是新手在這裏,我試圖尋找和一個XML文件,該文件是下面給出替換字符串:正則表達式在XML無法按預期工作

<name>xxx.yyy_zzz</name> 
     <constructor_arguments /> 
     <parameters> 
     <parameter> 
      <name>Name</name> 
      <string> 
      <value>yyy</value> 
      </string> 
     </parameter> 
     <parameter> 
      <name>abc</name> 
      <bool> 
      <value>false</value> 
      </bool> 
     </parameter> 
     <parameter> 
      <name>abcd</name> 
      <bool> 
      <value>true</value> 
      </bool> 
     </parameter> 
     <parameter> 
      <name>aa</name> 
      <integer> 
      <value>10</value> 
      </integer> 
     </parameter> 
     <parameter> 
      <name>bb</name> 
      <integer> 
      <value>100</value> 
      </integer> 
     </parameter> 
     <parameter> 
      <name>runtime_disabled</name> 
      <bool> 
      <value>false</value> 
      </bool> 

我曾嘗試以下改變runtime_disabled值爲true,但它並沒有發生,我希望發生的,任何人都可以告訴爲什麼會這樣出於同樣提供合適的解決方案合作

$data=~ s/(xxx\.i\yyy\_zzz\s*?<\/name>(.+?)runtime_disabled\s*?<\/name>\s*?<bool>\s*?<value>\s*?<value>.*?<\/value>)/$1true$2/g; 
+2

好像你正在試圖讓名,以便始終是更好地使用XML文檔解析器嘗試此鏈接http://stackoverflow.com/questions/2052179/how -can-i-find-and-replace-text-in-xml-using-perl –

+3

試圖用正則表達式解析XML是痛苦的祕訣。 – melpomene

回答

1

解析格式良好的XML要切實總是使用模塊完成。關於這一點已經有很多人說過,例如參見this pagethis page等等。我也聽說truly bad things may come to pass否則。

下面是一個如何使用XML::libXML來提問的例子。另一個優秀的模塊是XML::Twig。我完成了你的示例,使其成爲格式良好的XML文件(如下面的代碼所示)。

use strict 'all'; 
use warnings; 

use XML::LibXML;  

my $file = 'file.xml'; 

my $doc = XML::LibXML->load_xml(location => $file, no_blanks => 1); 

# Form the XPath expression used to find the 'name' nodes 
my $xpath = '//doc/constructor_arguments/parameters/parameter/name'; 

foreach my $node ($doc->findnodes($xpath)) 
{ 
    # Select the particular 'name' tag that is needed 
    if ($node->to_literal eq 'runtime_disabled') 
    { 
     # Query the parent node, for <name>'s sibling <bool> 
     foreach my $bval ($node->parentNode->findnodes('./bool/value/text()')) 
     { 
      my $content = $bval->toString; 
      $content =~ s/false/true/; 
      $bval->setData($content); 
     } 
    } 
} 

# Write a new file with the change 
$doc->toFile('changed_' . $file, 1); 

這應該是基本的,還有其他方法可以做到這一點。

張貼的樣品填充內容爲

<doc> 
... posted text ... 
      </parameter> 
     </parameters> 
    </constructor_arguments> 
</doc> 
+0

由於它是一個XML文件,我正在轉向您所建議的方法,例如,提到的方法正在工作。 – Emman

+0

@Emman Great--手動解析XML(正則表達式)導致無盡的麻煩。當你清理一個這樣的文件時,你將學習如何使用一個模塊,然後你就會被照顧。通過我提到的兩個模塊中的任何一個,您都可以完全掌控所有事情,而簡單的事情很簡單。閱讀關於這個主題的一些帖子是有益的。我會添加一些鏈接給他們。 – zdim

相關問題