我需要修改的 xml 檔案中有以下資訊:
<?xml version="1.0" encoding="utf-8"?>
<x:workbook xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"
xmlns:x="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
<x:workbookPr codeName="ThisWorkbook"/>
<x:bookViews>
<x:workbookView firstSheet="0" activeTab="0"/>
</x:bookViews>
<x:sheets>
<x:sheet name="Sheet1" sheetId="2" r:id="rId2"/>
</x:sheets>
<x:definedNames/>
<x:calcPr calcId="125725"/>
</x:workbook>
一般來說,前綴“x:”可以是任何東西,包括空前綴。
我現在需要向檔案中的“x:sheets”元素添加一個子元素“x:sheet”。但是,如果檔案內容沒有前綴,那么我需要在檔案中的“sheets”元素中添加一個子元素“sheet”。
由于前綴通常可以是任何東西,我使用以下 perl 代碼來掃描和修改檔案。
use strict;
use warnings;
use XML::Twig;
my $fileName1='/folder1/file1.xml';
my $fh1;
my $fh1_filename='/folder1/file1_NEW.xml';
my $tw1=new XML::Twig(
map_xmlns => {
'http://schemas.openxmlformats.org/officeDocument/2006/relationships' => 'r',
'http://schemas.openxmlformats.org/spreadsheetml/2006/main' => 's'
},
keep_original_prefix => 1,
pretty_print => 'indented',
twig_handlers => {'/s:workbook/s:sheets' => sub{Add_Sheet_1(@_)}}
);
$tw1->parsefile($fileName1);
open($fh1, '>:encoding(UTF-8)', $fh1_filename);
$tw1->flush($fh1);
close $fh1;
}
#
#
#
sub Add_Sheet_1{
my ( $twig, $tag) = @_;
my $var1='x:sheet';
$tag->insert_new_elt( 'last_child', => $var1=>{name=>'Sheet_N1',sheetId=>'200'});
}
對于前綴為“x:”的情況,此代碼生成所需的結果。
但是,一般來說,前綴是未知的。我的處理程式將未知前綴映射到前綴“s:”,因此找到正確的元素沒有問題。
但是,我找不到任何添加具有正確前綴的新子元素的方法。
有什么方法可以從檔案中獲取原始前綴并在添加新的子元素時使用它?
uj5u.com熱心網友回復:
如果您知道您感興趣的特定命名空間的 URI(在$schema_uri下面的變數中),您可以通過遍歷所有分配的前綴以查找匹配項來查找檔案中使用的前綴(如果有) :
sub Add_Sheet_1{
my ($twig, $tag) = @_;
my $ns = "";
foreach my $prefix ($twig->parser->current_ns_prefixes) {
if ($twig->original_uri($prefix) eq $schema_uri) {
$ns = "$prefix:";
last;
}
}
my $name = $ns . "sheet";
$tag->insert_new_elt('last_child', $name, {name => 'Sheet_N1', sheetId => '200'});
}
這適用于前綴 ( x:sheet) 并且當它是sheet我測驗中的默認命名空間 ( ) 時。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/425566.html
