2009-07-16 79 views
2

任何知道任何Perl模塊轉義XML文檔中的文本?如何在Perl中轉義XML文檔的文本?

我生成XML將包含由用戶輸入的文本。我想正確處理文本,以便生成的XML格式正確。

+3

什麼樣的「逃離」你指的是? – 2009-07-16 14:00:05

+1

您是否試圖手動創建XML輸出? – 2009-07-16 17:31:47

回答

7

我個人比較喜歡XML::LibXML - libxml的Perl綁定。其中一個優點 - 它使用最快的XML處理庫之一。下面是創建文本節點的示例:

use XML::LibXML; 
my $doc = XML::LibXML::Document->new('1.0',$some_encoding); 
my $element = $doc->createElement($name); 
$element->appendText($text); 
$xml_fragment = $element->toString(); 
$xml_document = $doc->toString(); 

而且,永遠不會手動創建XML。當人們發現你所做的事情時,它會對你的健康有害。

6

使用XML::Code

從CPAN

XML ::代碼逃逸()

通常情況下,節點的任何內容將在再現期間被轉義(即如「&」將用相應實體取代特殊符號)。呼叫逃生()零參數來防止它:

 my $p = XML::Code->('p'); 
     $p->set_text ("—"); 
     $p->escape (0); 
     print $p->code(); # prints <p>&#8212;</p> 
     $p->escape (1); 
     print $p->code(); # prints <p>&amp;#8212;</p> 
3

XML::Entities

use XML::Entities; 
my $a_encoded = XML::Entities::numify('all', $a); 

編輯:XML ::實體僅numifies HTML實體。使用HTML::Entities encode_entities($ a)代替

+0

XML :: Entities :: numify似乎只是將命名的XML實體轉換爲數字XML實體。 – coldeq 2009-07-16 23:12:32

+0

你說得對,我的錯。可以使用HTML :: Entities和encode_entities來代替。 – hovenko 2009-07-17 10:07:05

10

我不確定爲什麼需要轉義XML文件中的文本。如果您的文件包含:

<foo>x < y</foo> 

該文件儘管尖括號氾濫的XML文件。一個XML文件必須包含有效的數據意味着這樣的事情:

<foo>x &lt; y</foo> 

<foo><![CDATA[x < y]]></foo> 

因此,無論是:

  1. 你是不是要求在XML文件中逸出的數據。相反,您需要弄清楚如何將字符數據放入XML文件中,以便生成的文件是有效的XML;或

  2. 您在XML文件中有一些數據需要轉義其他一些原因

有意詳細說明一下嗎?

+0

對那些低估的人:我上面說的究竟是什麼錯誤? – 2009-07-16 15:24:04

+2

當你提醒他們他們的僞XML實際上不是真正的XML時,人們會生氣。這很有趣...而且很傷心。無論如何,我upvoted你:) – jrockway 2009-07-16 20:29:45

1

在檢查出由Krish推薦的XML :: Code後,我發現可以使用XML ::代碼text()函數完成此操作。例如,

use XML::Code; 
my $text = new XML::Code('='); 
$text->set_text(q{> & < " ' "}); 
print $text->code(); # prints &gt; &lt; &amp; " ' " 

傳遞'='會創建一個文本節點,它在打印時不包含標籤。 注意:這隻適用於文本數據。它不會正確地轉義屬性。

3

使用

XML ::發電機

需要XML ::發生器;

my $ xml = XML :: Generator-> new(':pretty',escape =>'always,''');

print $ xml-> h1(「& <>非html純文本<> &」);

這將打印標籤內的所有內容轉義(不與標記衝突)。

0

雖然您最好使用XML::LibXMLXML::Code這樣的模塊,但您可以將文本數據封裝在CDATA部分中。你只能小心不要把]]>在它(這個順序也不允許 CDATA節!):

$text =~ s/\]\]>/]]>]]&gt;<![CDATA[/; 
$text = "<![CDATA[$text]]>"; 
$xml = "<foo>$text</foo>"; 

至於獎金你的代碼看起來更Perlish的混淆! :-)

6

也可以使用XML :: Simple escape_value,但不建議在新程序中使用XML :: Simple。看到這個帖子後17436965.

手工添加逃逸可以使用正則表達式(從escape_value複製)來完成:

$data =~ s/&/&amp;/sg; 
$data =~ s/</&lt;/sg; 
$data =~ s/>/&gt;/sg; 
$data =~ s/"/&quot;/sg;