2011-07-15 48 views
3

我想使用LibXML從XML讀取標記。我可以打印所有標籤;然而,由於某些原因,它還會打印不屬於我的XML的「文本」標籤。任何人都可以向我解釋導致此行爲的原因?任何工作?如果下一次我有一個帶有「text」標籤的XML標籤,那麼我怎麼能從LibXML生成的額外的「text」標籤中區分出「text」標籤?Perl LibXML打印額外的「文本」標記

這是我的XML文件:

<?xml version="1.0"?> 
<log> 
<logentry 
    revision="935"> 
<author>darwin</author> 
<date>2011-06-28T01:00:18.997106Z</date> 
<msg>reintegrate branch</msg> 
</logentry> 
<logentry 
    revision="931"> 
<author>darwin</author> 
<date>2011-06-21T22:15:01.881607Z</date> 
<msg>reintegrate branch</msg> 
</logentry> 
</log> 

我用下面的代碼讀取XML:

my $parser = XML::LibXML->new(); 
my $doc = $parser->parse_string($svnInfo); 
my $root = $doc->getDocumentElement(); 
my @nodes=$root->childNodes(); 

foreach my $child(@nodes) { 
     my $name = $child -> nodeName(); 
     my @atts = $child -> getAttributes(); 
     print "\n${name} ("; 

     print ")\n"; 
} 

這是我的輸出:

text() 

logentry() 

text() 

logentry() 

text() 

感謝您的幫助。

回答

3

嘗試增加$parser->keep_blanks(0)my $doc = $parser->parse_string($svnInfo);

編輯改變no_blanks到keep_blanks

+0

給我一個錯誤:「找不到auto/XML/LibXML/no_blanks.al」。 我使用的是perl 5.8.8,也許該函數不包含在庫中。 – lwijono

+0

愚蠢的我,那是古老的。嘗試反過來(並參見編輯),'$ parser-> keep_blanks(0);' – mrk

+0

太棒了,讓它可以使用:「$ parser-> keep_blanks(0)」。 謝謝! – lwijono

7

因爲在最後的</logentry></log>之間有一個僅含空白的文本節點(包含換行符)。還要注意第一個text(),它對應於<log>和第一個<logentry>之間的換行符文本節點。

+0

什麼?那是什麼原因造成的?這很奇怪,因爲我擁有的只是普通的XML。 XML閱讀器是不是忽略了所有的空白(不是標籤的一部分)?另外,爲什麼它將空白分配爲「文本」標籤?如果我有一個「文字」標籤怎麼辦?我怎麼知道哪一個是哪一個(假設我在我的「文本」標籤上有/ n)? 順便說一句,謝謝你指出。你知道任何解決方法來解決這個問題嗎? – lwijono

+3

您的XML閱讀器的特定實現可能會提供一個選項來忽略只有空白的節點,但通常解析器無法知道它們是否對_you_有意義,因此它將返回它們。如果你願意,你可以自由地忽略它們。 –

+0

感謝您指出這一點。 – lwijono