使用XML :: libXML解析xml - 获取第n个子节点

时间:2013-04-08 19:48:08

标签: mysql xml perl

我有一个xml文档,其中包含我想要放入数据库的信息。例如:

<pc>
    <name>John</name>
    <last>Smith</last>
    <address>
        <business>
            <street>987 Broad Way</street>
            <city>New York</city>
            <state>New York</state>
        </business>
        <home>
            <street>123 Main St.</street>
            <city>Jersey City</city>
            <state>Nebraska</state>
        </home>
    </address>
    <phone>123-456-7890</phone>
</pc>

我正在计划使用perl来解析这些数据来构建mysql语句。我在获取如下格式时遇到问题:

name="John"
last="Smith"
...

我目前使用的代码是:

use strict;
use warnings;
use XML::LibXML;

my $filename = "sample.xml";
my $parser = XML::LibXML->new();
my $xmldoc = $parser->parse_file($filename);

for my $contact ($xmldoc->findnodes('/server')){
    print $contact->nodeName(),"\n";
    foreach my $child ($contact->findnodes('*')){
        print "\t", $child->nodeName(), ":\n";
        foreach my $grandchild ($child->findnodes('*')){
            print"\t\t", $grandchild->nodeName(), ":", $grandchild->textContent(), "\n";
        }
    }
}

我没有使用perl,我对XML :: libXML库(http://metacpan.org/pod/XML::LibXML)并不太熟悉。我想我需要找到最后一个孩子并按照我的方式回到节点上?关于如何为mysql构建我的“插入”和“更新”,我有点迷茫。

1 个答案:

答案 0 :(得分:0)

修改this code以通过所有孩子。这是我完成的代码:

my $nodes = $xml->findnodes('//*');
foreach my $node ($nodes->get_nodelist) {
  my $children;
  my $nodeSide = ($node->findnodes('*')->size);
if ($nodeSize > 0){
printf "%n%s :\n", $node->localname;
}
else {
printf "%s: %s\n", $node->localname, $node->textContent();
}
}

通过输出,我可以做类似的事情,

插入db($ node-&gt; textContent());

再说一遍,这不是一个好的sql语句,但我稍后会继续讨论。重要的部分是节点分离和迭代。