首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何自动向特定XML元素添加属性(R或Perl或.)

如何自动向特定XML元素添加属性(R或Perl或.)
EN

Stack Overflow用户
提问于 2014-03-10 13:47:22
回答 3查看 869关注 0票数 1

我正在从inkscape生成SVg文件,并希望自动编辑它们,以便向文件中的选定元素添加一些属性。

假设原来的SVG是这样的

代码语言:javascript
运行
复制
<svg height="100" width="100">
<circle cx="50" cy="50" r="40" fill="red" id="red-circle"/>
<circle cx="100" cy="50" r="40" fill="green" />
</svg> 

然后,我希望找到具有和id的元素,并向这些元素中添加一些其他属性,如最后的xml如下所示

代码语言:javascript
运行
复制
<svg height="100" width="100">
<circle cx="50" cy="50" r="40" fill="red" id="red-circle" new-attribute="newvalue"/>
<circle cx="100" cy="50" r="40" fill="green" />
</svg> 

我想知道最好的方法是自动化这个过程(使用标记id查找元素并向它们添加新的属性)。我需要对大量的SVG文件进行处理,所以自动化是绝对必要的.我想在R或Perl中这样做,但我愿意接受任何建议。

PS: SVG的总体结构可能会在文档之间发生变化,所以我不能依靠文档的结构来解析它。我唯一的线索是某些元素有一个id属性

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-03-10 15:06:44

这里是一个XML::Twig版本,尽管我发现choroba的答案非常令人高兴:

代码语言:javascript
运行
复制
#!/usr/bin/perl
use strict;
use warnings;
use XML::Twig;

# configuration
my ($infile, $id) = ('diag.svg', 'red-circle');
my ($att, $value) = ('attribute', 'value');

# processing
my $twig = XML::Twig->new(
    keep_spaces => 1,
    twig_handlers => {
        qq([\@id = "$id"]) => sub {
            $_->set_att($att, $value);
        },
    },
);
$twig->parsefile($infile);

# output
$twig->print;
票数 3
EN

Stack Overflow用户

发布于 2014-03-10 14:21:56

在Perl中,使用XML::XSH2 ( XML::LibXML的包装器)

代码语言:javascript
运行
复制
open file.svg ;
for //*[@id] set @new_attribute "newvalue" ;
save :b ;
票数 3
EN

Stack Overflow用户

发布于 2015-04-03 18:06:40

在r中,下面将从kbb.com下载一个页面,解析它以查找锚标记,其中包含href/honda/accord/,然后将属性Fig_Vodka="Don't mind if I do"添加到所述已解析标记的XMLNodeSet中。

代码语言:javascript
运行
复制
library(XML)
## download the webpage
kbbHTML <- readLines("http://www.kbb.com/used-cars/honda/accord/2014/private-party-value")
## parse the downloaded document to an XMLInternalDocument
kbbInternalTree <- htmlTreeParse(kbbHTML,useInternalNodes=T)
#kbbInternalTree <- htmlParse(kbbHTML, asText = TRUE) #equally valid parsed content as above
## select nodes matching our XPath expression
specific.nodes <- getNodeSet(doc = kbbInternalTree, path ="//a[contains(@href,'/honda/accord/')]")
sapply(specific.nodes, function(x) xmlAttrs(x)<-c(Fig_Vodka="Don't mind if I do"))

以上代码取自如何用R购买二手车(第二部分)基于R的数据科学的XML和Web技术第6.3.1节。

干杯!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22301962

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档