[英]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 :: XSH2是XML :: 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.