Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.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,删除XML节点_Xml_Perl_Xml Simple - Fatal编程技术网

Perl,删除XML节点

Perl,删除XML节点,xml,perl,xml-simple,Xml,Perl,Xml Simple,Data.xml 我如何删除这部分XML,或者通过删除数组数据,或者删除纯文件文本,以便将新结构写回原始data.XML文件 编辑:以下内容是在问题中添加“请不要建议我使用其他库”之前发布的。我离开它,因为我仍然认为正确的答案是“不要使用XML::Simple”。你可以随意用锤子把螺丝钉钉在墙上,但这并不能改变这样一个事实:不管你怎么用力,结果都会很糟糕 不要使用,这真的很容易。甚至XML::Simple都说: 不鼓励在新代码中使用此模块。还提供了其他模块,它们提供了更直观和一致的接口 基本问题

Data.xml


我如何删除这部分XML,或者通过删除数组数据,或者删除纯文件文本,以便将新结构写回原始data.XML文件

编辑:以下内容是在问题中添加“请不要建议我使用其他库”之前发布的。我离开它,因为我仍然认为正确的答案是“不要使用
XML::Simple
”。你可以随意用锤子把螺丝钉钉在墙上,但这并不能改变这样一个事实:不管你怎么用力,结果都会很糟糕

不要使用,这真的很容易。甚至
XML::Simple
都说:

不鼓励在新代码中使用此模块。还提供了其他模块,它们提供了更直观和一致的接口

基本问题是,只有简单的XML可以通过散列和数组直接表示。如果您仔细想想,XML允许在同一个父节点下复制节点,但具有不同的属性和内容。它还允许一元标记

不如改用:

如果需要,您还可以使用
parsefile\u inplace
通过就地编辑执行此操作。否则,打开一个新文件并通过
$twig->sprint
输出新的XML

e、 g:

如果您打算用锤子拧螺丝,那么应该使用初始代码和
XML::Simple

$xml->{people}[0]{person} = 
     [ grep { not $_->{name} eq $remove_person }
                      @{ $xml->{people}[0]{person} } ];
使用
name
属性上的过滤数组替换有问题的数组

产出:

<people>
  <person name="John">
    <param name="age" value="21" />
  </person>
</people>

正如您已经提到的,我们的重点是使用Perl数据结构,而不是字符串操作。所以,忘记
s//
并尝试一下

my $xml = XMLin($data, ForceArray => 1, KeepRoot => 1);
my $remove = 'Jane';
delete $xml->{people}[0]{person}{$remove};
print XMLout($xml, KeepRoot => 1);
或者,使用空的
KeyAttr

my $xml = XMLin($data, ForceArray => 1, KeepRoot => 1, KeyAttr => []);
@{ $xml->{people}[0]{person} } = grep $_->{name} ne $remove,
                                 @{ $xml->{people}[0]{person} };
print XMLout($xml, KeepRoot => 1);
为了进行比较,相同的任务在:


遗憾的是,我最终遇到了大致相同的问题,我不得不在AIX上编辑一些XML,而没有附加的库。我最后搬走了这样的东西

perl -0777 -p -i -e "s;(<HARDWARE>.*)<DESCRIPTION>.*<\/DESCRIPTION>(.*<\/HARDWARE>);\$1\$2;s" my.xml
perl-0777-p-i-e“s;(.*)。*(.*);\$1\$2;s”my.xml

这太难看了。我不喜欢它。但它当时起了作用,并且让您知道如何编写一个应该时不时编写的regexpr。

建议不要使用delete函数(讽刺的是,我使用的是stone::Simple)。我的问题的最终产物是一个电话系统脚本,如果没有它,系统将无法运行。如果进行了正确的索引检查,我是否可以假设使用delete不会导致perl文档中警告的任何“意外行为”?(我已经在::Simple上遇到了足够的困难,所以我更愿意减少任何额外的困难/风险)@Simon<代码>删除不应用于数组。我用它做了个杂凑,没问题。
$xml->{people}[0]{person} = 
     [ grep { not $_->{name} eq $remove_person }
                      @{ $xml->{people}[0]{person} } ];
<people>
  <person name="John">
    <param name="age" value="21" />
  </person>
</people>
my $xml = XMLin($data, ForceArray => 1, KeepRoot => 1);
my $remove = 'Jane';
delete $xml->{people}[0]{person}{$remove};
print XMLout($xml, KeepRoot => 1);
my $xml = XMLin($data, ForceArray => 1, KeepRoot => 1, KeyAttr => []);
@{ $xml->{people}[0]{person} } = grep $_->{name} ne $remove,
                                 @{ $xml->{people}[0]{person} };
print XMLout($xml, KeepRoot => 1);
 open data.xml ;
 my $remove = 'Jane' ;
 delete /people/person[@name=$remove] ;
 save :b ;
perl -0777 -p -i -e "s;(<HARDWARE>.*)<DESCRIPTION>.*<\/DESCRIPTION>(.*<\/HARDWARE>);\$1\$2;s" my.xml