Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl module 无法查找仅限于当前父级的节点()_Perl Module - Fatal编程技术网

Perl module 无法查找仅限于当前父级的节点()

Perl module 无法查找仅限于当前父级的节点(),perl-module,Perl Module,我正在解析一个简单的XML文件以从中创建一个平面文本文件。示例XML下面显示了所需的结果。XML有一种标题详细结构(分别是Assembly_Info和Part),有一个唯一的标题节点,后跟任意数量的详细记录节点,所有这些节点都是同级节点。在深入挖掘了标题下的元素之后,我找不到一种方法返回“up”,然后拾取所有同级细节节点 XML文件如下所示: <?xml version="1.0" standalone="yes" ?> <Wrapper> <Record>

我正在解析一个简单的XML文件以从中创建一个平面文本文件。示例XML下面显示了所需的结果。XML有一种标题详细结构(分别是Assembly_Info和Part),有一个唯一的标题节点,后跟任意数量的详细记录节点,所有这些节点都是同级节点。在深入挖掘了标题下的元素之后,我找不到一种方法返回“up”,然后拾取所有同级细节节点

XML文件如下所示:

<?xml version="1.0" standalone="yes" ?>
<Wrapper>
  <Record>
    <Product>
      <prodid>4094</prodid>
    </Product>
    <Assembly>
      <Assembly_Info>
        <id>DF-7A</id>
        <interface>C</interface>
      </Assembly_Info>
      <Part>
        <status>N/A</status>
        <dev_name>0000</dev_name>
      </Part>
      <Part>
        <status>Ready</status>
        <dev_name>0455</dev_name>
      </Part>
      <Part>
        <status>Ready</status>
        <dev_name>045A</dev_name>
      </Part>
    </Assembly>
    <Assembly>
      <Assembly_Info>
        <id>DF-7A</id>
        <interface>C</interface>
      </Assembly_Info>
      <Part>
        <status>N/A</status>
        <dev_name>0002</dev_name>
      </Part>
      <Part>
        <status>Ready</status>
        <dev_name>0457</dev_name>
      </Part>
     </Assembly>
  </Record>
</Wrapper>
my $parser = XML::LibXML -> new();
my $tree = $parser -> parse_file ('DEMO.XML');

    for my $product ($tree->findnodes ('/Wrapper/Record/Product/prodid')) {
        $prodid = $product->textContent();
    }

    foreach my $assembly ($tree->findnodes ('/Wrapper/Record/Assembly')){
        $assemblies++;
        $parts = 0;
        for my $assembly ($tree->findnodes ('/Wrapper/Record/Assembly/Assembly_Info')) {
            $id = $assembly->findvalue('id');
            $interface = $assembly->findvalue('interface');
        }

        foreach my $part ($tree->findnodes ('/Wrapper/Record/Assembly/Part')) {
            $parts++;
            $status          = $part->findvalue('status');
            $dev_name        = $part->findvalue('dev_name');
        }
        print "Assembly No: ", $assemblies, " Parts: ",$parts, "\n";
    }
我正在尝试使用findnodes()来实现这一点,因为这是我认为我了解的唯一工具。不幸的是,我的代码从每个程序集的整个文件中读取所有零件记录——因为我能够找到零件节点的唯一方法是从根开始。如果你愿意,我不知道如何改变“我在哪里”;告诉findnodes从当前父节点开始。代码如下所示:

<?xml version="1.0" standalone="yes" ?>
<Wrapper>
  <Record>
    <Product>
      <prodid>4094</prodid>
    </Product>
    <Assembly>
      <Assembly_Info>
        <id>DF-7A</id>
        <interface>C</interface>
      </Assembly_Info>
      <Part>
        <status>N/A</status>
        <dev_name>0000</dev_name>
      </Part>
      <Part>
        <status>Ready</status>
        <dev_name>0455</dev_name>
      </Part>
      <Part>
        <status>Ready</status>
        <dev_name>045A</dev_name>
      </Part>
    </Assembly>
    <Assembly>
      <Assembly_Info>
        <id>DF-7A</id>
        <interface>C</interface>
      </Assembly_Info>
      <Part>
        <status>N/A</status>
        <dev_name>0002</dev_name>
      </Part>
      <Part>
        <status>Ready</status>
        <dev_name>0457</dev_name>
      </Part>
     </Assembly>
  </Record>
</Wrapper>
my $parser = XML::LibXML -> new();
my $tree = $parser -> parse_file ('DEMO.XML');

    for my $product ($tree->findnodes ('/Wrapper/Record/Product/prodid')) {
        $prodid = $product->textContent();
    }

    foreach my $assembly ($tree->findnodes ('/Wrapper/Record/Assembly')){
        $assemblies++;
        $parts = 0;
        for my $assembly ($tree->findnodes ('/Wrapper/Record/Assembly/Assembly_Info')) {
            $id = $assembly->findvalue('id');
            $interface = $assembly->findvalue('interface');
        }

        foreach my $part ($tree->findnodes ('/Wrapper/Record/Assembly/Part')) {
            $parts++;
            $status          = $part->findvalue('status');
            $dev_name        = $part->findvalue('dev_name');
        }
        print "Assembly No: ", $assemblies, " Parts: ",$parts, "\n";
    }

在深入到装配信息之后,如何仅获取给定装配的零件节点?有一点我不明白,我想问题可能是,我认为这是“导航”或移动光标,如果你愿意的话。XPath路径表达式的示例对我没有帮助。

您可以使用任何其他节点,尤其是子节点,而不是始终使用
$tree
作为
findnodes
方法的起点。然后可以使用相对XPath表达式。例如:

for my $record ($tree->findnodes('/Wrapper/Record')) {
    for my $assembly ($record->findnodes('./Assembly')) {
        for my $part ($assembly->findnodes('./Part')) {
        }
    }
}
是的,这就是解决办法,也填补了我在理解上的严重差距。