2011-05-25 126 views
1

我有這樣的「file.xml如何在perl中使用xml :: libxml檢索xml的所有節點?

<tables> 
     <table> 
       <name>abc</name> 
       <row>12</row> 
       <col>13</col> 
     <table> 
       <name>xyz</name> 
       <IsWrapper/> 
      <table> 
         <name>dummy</name> 
         <row>121</row> 
         <col>131</col> 
      </table> 
     </table>   
    </tables> 

    I am using xml::libxml using perl. Here is the code. 

# ----- Parsing config XML file --- 
my $parser = XML::LibXML->new(); 
my $xmldoc = $parser->parse_file ("file.xml") || die("Could not parse xml file\n"); 
my $root = $xmldoc->getDocumentElement()|| die("Could not get Document Element \n"); 
print "\n root = $root \n"; 
if ($root->nodeType == ELEMENT_NODE) 
    { 

     foreach my $child ($root->getChildNodes()) 
     { 
      #print "\n my child: $child \n"; 
      $st = $child->textContent; 
      print "\n child name: $st \n"; 
      if ($child->nodeName eq 'table') 
      { 
       $dc = $child->nodeName; 
       print "\n node name is node: $dc\n"; 
       if (defined($child->getElementsByTagName('IsWrapper',0)->item(0))) 
       { 
        #do some thing 
       } 
       else 
       { 
        print "\n eneterd in else part\n"; 
        #do some thing   
       } 
      } 
     } 
    } 

一個XML文件,但我不能讓主節點。我能夠得到的只有這個結構。

<table> 
      <name>xyz</name> 
      <IsWrapper/> 
     <table> 
        <name>dummy</name> 
        <row>121</row> 
        <col>131</col> 
     </table> 
    </table>  

我怎麼能獲得結構中的所有元素以相同的順序。

輸出應該是這樣的

<tables> 
<table><name>abc</name> 
    <row>12</row> 
    <col>13</col> 
    <name>xyz</name> 
     <row>121</row> 
    <col>131</col> 
     </table> 
</tables> 

如何解析上述XML並使用Perl在libxml中獲取以下輸出?

幫助非常感謝。

回答

1

這不是 XML文檔。 你有三個開放的表標籤,只有兩個關閉。

您應該首先檢查您的XML代碼,並首先檢查XML-Validator

0

我同意AlexTheBird。

如果您更改有效統計信息的xml,您將能夠解析文件。 此文件:

<tables> 
    <table> 
     <name>abc</name> 
     <row>12</row> 
     <col>13</col> 
    </table> 
</tables> 

給我後續的結果,使用XML ::簡單

$VAR1 = { 
     'table' => { 
       'col' => '13', 
       'row' => '12', 
       'name' => 'abc' 
       } 
    }; 
+0

OK OK ....但如何將得到所有的節點,因爲引用是file.xml繼續進行所以下面的輸出。請讓我知道如何在獲取所有節點時繼續使用xml :: libxml。 – user760857 2011-05-26 03:26:44

+0

如果一個XML文檔的格式不是一個XML文檔,那麼它就不能被當作一個XML文檔處理。告訴創建這個的人去學習一些關於XML的知識或者不使用它,因爲當你使用XML-Parsers時,格式良好是必須的。我想你必須爲這個破損的XML寫你自己的解析器。 – AlexTheBird 2011-05-26 16:40:22