Как получить все узлы xml с помощью xml ::libxml в perl?

#xml #perl

#xml #perl

Вопрос:

У меня есть XML-файл, подобный этому «file.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 filen");
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: $dcn";
                if (defined($child->getElementsByTagName('IsWrapper',0)->item(0)))
                { 
                    #do some thing
                }
                else
                {   
                    print "n eneterd in else partn";
                    #do some thing        
                }
            }
        }
    }
  

Но я не могу получить основной узел. Я могу получить только эту структуру.

 <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 и получить приведенный ниже вывод в libxml с использованием Perl?

Помощь очень ценится.

Ответ №1:

Это не правильно сформированный XML-документ. У вас есть три открывающих тега таблицы и только два закрывающих.

Сначала вы должны проверить свой XML-код с помощью XML-валидатора.

Ответ №2:

Я согласен с AlexTheBird.

Если вы измените xml на допустимую статистику, вы сможете проанализировать файл. Этот файл:

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

Дайте мне следующий результат, используя XML ::Simple

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

Комментарии:

1. хорошо, хорошо …. но как дальше поступить с получением всех узлов, потому что ссылка file.xml итак, приведенный ниже вывод. Пожалуйста, дайте мне знать, как действовать с xml :: libxml для получения всех узлов.

2. Если XML-документ неправильно сформирован, то это не XML-документ, и поэтому его нельзя рассматривать как XML-документ. Скажите людям, которые создали это, чтобы они узнали что-нибудь о XML или не использовали его, потому что правильная форма обязательна при работе с XML-анализаторами. Я думаю, вам нужно написать свой собственный анализатор для этого неработающего XML.