【问题标题】:How to insert an ancestor and sibling for an element using xpath in perl?如何在 perl 中使用 xpath 为元素插入祖先和兄弟?
【发布时间】:2014-09-03 10:52:34
【问题描述】:

我想在 perl 中使用 xpath 为元素插入祖先和兄弟。

这是我的意见

<docinfo:hier>
<docinfo:hierlev role="ancestor">
<heading>
<title>CENTRAl</title>
</heading>
<docinfo:hierlev role="ancestor">
<heading>
<title>A</title>
</heading>
<docinfo:hierlev role="ancestor">
<heading><title>AC</title></heading>
<docinfo:hierlev role="ancestor">
<heading><title>THE ACTUARIE</title></heading>
<docinfo:hierlev role="ancestor">
<heading><title>CHAPTER VII </title></heading>
<docinfo:hierlev role="me">
<heading>
<title>46. Terms and conditions of Chairman and Members of Board.</title>             
</heading>
</docinfo:hierlev>
</docinfo:hierlev>
</docinfo:hierlev>
</docinfo:hierlev>
</docinfo:hierlev>
</docinfo:hierlev>

我想要这样的输出:

##代表新插入的元素

<docinfo:hier>
<docinfo:hierlev role="ancestor">
<heading><title>Rules</title></heading># here i want change the text
<docinfo:hierlev role="ancestor">##
<heading>##
<title>Rule</title>##
</heading>##
<docinfo:hierlev role="ancestor">
<heading><title>A</title></heading>
<docinfo:hierlev role="ancestor">
<heading><title>AC</title></heading>
<docinfo:hierlev role="ancestor">
<heading><title>THE ACTUARIE</title></heading>
<docinfo:hierlev role="ancestor">
<heading><title>CHAPTER VII </title></heading>
<docinfo:hierlev role="me">
<heading>
<title>46. Terms and conditions of Chairman and Members of Board.</title>
</heading>
</docinfo:hierlev>
</docinfo:hierlev>
</docinfo:hierlev>
</docinfo:hierlev>
</docinfo:hierlev>
</docinfo:hierlev>##
</docinfo:hierlev>
</docinfo:hier>

这是我的源代码

当我运行代码时,它只插入元素标题。

#!/usr/bin/perl
use strict;
use warnings;
use XML::LibXML;

my $parser = XML::LibXML->new;
my $doc = $parser->parse_file("mytest.xml");
my $root = $doc->getDocumentElement();
my ($ref_node) = $doc->findnodes('/LEGDOC/docinfo/docinfo:hier/docinfo:hierlev/heading');

my $new_element= $doc->createElement("docinfo:hierlev");
my $new_element= $doc->createElement("heading");
my $new_element= $doc->createElement("title");
$new_element->appendText('rule');
$ref_node->parentNode->insertAfter($new_element, $ref_node);

print $root->toString(1);

【问题讨论】:

  • 你声明了$new_element 三次。这会产生警告。
  • 嗨 Friedo 感谢您的建议,我已经更改了变量名,但它也无法正常工作

标签: xml perl xpath perl-module


【解决方案1】:

正如 Friedo 上面建议的那样,不是将每个元素添加到 $new_element 变量中,而是覆盖它。

我的 Perl 有点生疏了,但我认为您需要以下内容。我知道这可以用更少的代码行来完成,但为了清楚起见,我尝试将这些步骤分开。

  -- create distinct nodes for each level
  my $newDocInfoElement = $doc->createElement("docinfo:hierlev");
  my $newHeadingElement = $doc->createElement("heading");
  my $newTitleElement = $doc->createElement("title");
  $newTitleElement->appendText('rule');

  --append them into the structure that you want
  $newHeadingElement->addChild($newTitleElement);
  $newDocInfoElement->addChild($newHeadingElement);

  --add the whole structure to your XML
  $ref_node->parentNode->insertAfter($newDocInfoElement, $ref_node);

希望这是有帮助的。

【讨论】:

  • 它创建了一个元素,但它不会成为下一个 docinfo:hierlev 的祖先
  • 我目前没有可以测试的系统,所以它是从内存中完成的。我最好的建议是查看search.cpan.org/dist/XML-LibXML/lib/XML/LibXML/Node.pod 上的一些方法,并尝试一些方法,看看是否可以使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多