使用XML :: libXML解析xml - 获得第n个子节点
问题描述:
我有一个xml文档,其中包含要放入数据库的信息。例如:使用XML :: libXML解析xml - 获得第n个子节点
<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的“插入”和“更新”有点失望。
答
修改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();
}
}
随着输出,我可以做这样的事情,
插入到数据库($节点 - >的textContent());
再次,这不是一个好的sql语句,但我会在以后的工作。重要的部分是节点分离和迭代。
您的代码与您的输入和您声明的期望输出无关,尽管声明您希望SQL,但它不是SQL。而你的头衔表明希望找到第n个孩子,这对于给定的XML来说是完全不需要的。你能理解这一切吗? – ikegami 2013-04-08 20:46:45
对不起,我的想法是我会用perl来解析xml文件并建立sql语句并一次运行它们。 – Jeff 2013-04-09 00:52:46