簡體   English   中英

使用XML :: LibXML替換XML節點

[英]Use XML::LibXML to replace an XML node

有人能幫助我嗎? 我需要使用Perl和XML::LibXML模塊替換XML節點

這是XML文件的片段:

<utenti>
    <utente>
        <username>amministratore</username>
        <useremail>admin@email.com</useremail>
        <password>0000</password>
    </utente>
</utenti>

我需要替換密碼的值。

特別是我必須在XML文件中找到具有特定用戶名的用戶(由cookie $userCookie )並用變量$newPSW替換他的密碼。

我試過這個:

    my $psw = $doc->findnodes("/utenti/utente[username=\"$userCookie\"]/password");
    my $parent = $psw->parentNode;
    $parent->removeChild($psw);


    my $password = XML::LibXML::Element->new('password');
    $password->appendText( $newPSW );
    $parent->appendChild($password);

但每次瀏覽器給我以下錯誤:

Can't locate object method "parentNode" via package "XML::LibXML::NodeList"

似乎找不到我使用的任何方法。

有人可以幫忙嗎?

你得到一個XML::LibXML::NodeList作為結果。 而且這個對象沒有parentNode函數。 您必須獲取數組的第一個元素,然后在其上調用方法parentNode

第一個對象是XML::LibXML::Node類的對象,它有一個funnd parentNode

有關更多詳細信息,請參閱XML :: LibXML :: Node的文檔

my $psw = $doc->findnodes("/utenti/utente[username=\"$userCookie\"]/password");
my $parent = $psw->[0]->parentNode;
$parent->removeChild($psw->[0]);

問題是$psw是一個XML::LibXML::NodeList對象,而不僅僅是一個節點 - 盡管它應該是一個節點的列表

這里最簡單的解決方案是使用列表賦值來獲取列表中的第一個 - 並且希望只有 - 元素

如果嵌入雙引號,也可以更改字符串分隔符

像這樣

my ($psw) = $doc->findnodes(qq</utenti/utente[username="$userCookie"]/password>);

XML :: XSH2XML :: LibXML的包裝器,可以讓您的生活更輕松:

set /utenti/utente[username="amministratore"]/password $newPSW ;

更新:您不需要弄亂父級來更改節點的內容

#!/usr/bin/perl --
use strict;
use warnings;
use XML::LibXML 1.70; ## for load_html/load_xml/location
my $xml = q{<a><b><c>old password</c></b></a>};
my $dom = XML::LibXML->new(qw/ recover 2 /)->load_xml(
#~     location => $filepath_or_http,
    string => $xml,
);
my $password = $dom->findnodes('//c')->get_node(0);
$password->removeChildNodes;
$password->appendText('new password');
print "$dom";
__END__
<?xml version="1.0"?>
<a><b><c>new password</c></b></a>

您甚至可以通過xpath :)詢問父級,並使用列表上下文findnodes返回節點列表而不是... NodeList對象

#!/usr/bin/perl --
use strict;
use warnings;
use XML::LibXML 1.70; ## for load_html/load_xml/location
my $xml = q{<a><b><c></c></b></a>};
my $dom = XML::LibXML->new(qw/ recover 2 /)->load_xml(
#~     location => $filepath_or_http,
    string => $xml,
);
my( $parent ) = $dom->findnodes('//c/..');
print $parent->nodePath;
__END__
/a/b

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM