我意识到这可能是一个被问及回答的问题,但请耐心等待.
我想知道是否可以使用注释将代码注入到类编译时.经典的例子是为对象的成员生成一个getter和setter.这不是我所需要的,但它有助于说明基本思想.
现在在互联网上我得到的基本答案是否定的,但这个人做到了:
有谁知道他是怎么做的(如果他真的做了他说的话)?
主要的是他没有使用注释处理器来生成要编译的新java文件.我所知道的这种技术并不适用于我们的目的.
谢谢
我是Perl的新手,我正在使用ActivePerl.我收到以下错误:
无法在@INC中找到XML/LibXML.pm ...
我已经尝试了一切,但无法找到为XML :: LibXML安装"正确"模块的步骤.
这正是发生了什么.我从命令提示符运行脚本:
c:\ temp> perl myscript.pl
myscript.pl的前几行:
#!/usr/bin/perl
use Archive::Zip qw( :ERROR_CODES :CONSTANTS );
use HTTP::Date;
use XML::Parser;
use LWP::UserAgent;
use XML::LibXML;
use Archive::Extract;
use Encode;
use LWP::Simple;
require HTTP::Request;
...
Run Code Online (Sandbox Code Playgroud)
然后我收到这个错误:
c:\ temp> perl myscript.pl无法在myscript.pl第7行的@INC(@INC包含:C:/ Perl/site/lib C:/ Perl/lib.)中找到XML/LibXML.pm.BEGIN失败 - 汇编在myscript.pl第7行中止
我无法在Perl中使用XML :: LibXML包理解/使用名称空间.我可以成功访问元素但不能访问属性.我有以下代码访问XML文件(http://pastebin.com/f3fb9d1d0).
my $tree = $parser->parse_file($file); # parses the file contents into the new libXML object.
my $xpc = XML::LibXML::XPathContext->new($tree);
$xpc->registerNs(microplateML => 'http://moleculardevices.com/microplateML');
Run Code Online (Sandbox Code Playgroud)
然后我尝试访问一个名为common-name的元素和一个名为name的属性.
foreach my $camelid ($xpc->findnodes('//microplateML:species')) {
my $latin_name = $camelid->findvalue('@name');
my $common_name = $camelid->findvalue('common-name');
print "$latin_name, $common_name" ;
}
Run Code Online (Sandbox Code Playgroud)
但只有latin-name(@name)打印出来,通用名称不是.我做错了什么,如何才能打印出通用名称?
@name在这种情况下做了什么?我认为它是一个数组,并且属性应该放在一个数组中,因为可以有多个,但是元素(如common-name)不应该是因为应该只有一个?
我一直在关注这里的例子:http ://www.xml.com/pub/a/2001/11/14/xml-libxml.html和这里:http://perl-xml.sourceforge.net/faq /#namespaces_xpath,并试图让他们的示例camel脚本使用我的命名空间,因此奇怪的命名空间.
我的问题是:如何将一些参数传递给XML:Twig的处理程序,以及如何从处理程序返回结果.
这是我的代码,硬编码:
<counter name = "music", report type = "month", stringSet index = 4>.
如何通过使用参数来实现这个$counter_name,$type,$id?以及如何返回string_list的结果?谢谢(抱歉,我没有在这里发布xml文件,因为我有一些麻烦.<和>中的任何内容都被忽略).
use XML::Twig;
sub parse_a_counter {
my ($twig, $counter) = @_;
my @report = $counter->children('report[@type="month"]');
for my $report (@report){
my @stringSet = $report->children('stringSet[@index=”4”]');
for my $stringSet (@stringSet){
my @string_list = $stringSet->children_text('string');
print @string_list; # in fact I want to return this string_list,
# not just print it.
}
}
$counter->flush; # free the memory of $counter
}
my $roots …Run Code Online (Sandbox Code Playgroud) 我只想解析一个感兴趣的xml元素(例如见下面:类名称等于数学的类元素),我想在解析遇到这个条件的第一个元素时停止.(因为只有一个名为math的类,所以一旦找到元素就没有必要继续).
但是,如果我按如下方式实现,代码在找到我感兴趣的元素之后继续读取整个文件(xml文件很长,因此需要很长时间).我的问题是如果解析了name = math的第一个类元素后如何停止它?
my $twig = new XML::Twig(TwigRoots => {"class[\@name='math']" => \&class});
$twig->parsefile( shift @ARGV );
此外,我还希望在解析之后从xml文件(不仅是内存)中删除此类,以便下次解析具有其他名称的类时,不会解析类元素.有可能吗?
我是XML :: Twig的新手.如何更改所有空元素以使用空元素标记(<foo/>)而不是开始标记和结束标记组合(<foo></foo>)?
输入:
<book>
<given-names>Maurice<xref ref-type="fn" rid="fnI_1"></xref></given-names>
<colspec colname="col1" colnum="1"></colspec>
<entry align="left"><p></p></entry>
</book>
Run Code Online (Sandbox Code Playgroud)
我需要输出为:
<book>
<given-names>Maurice<xref ref-type="fn" rid="fnI_1"/></given-names>
<colspec colname="col1" colnum="1"/>
<entry align="left"><p/></entry>
</book>
Run Code Online (Sandbox Code Playgroud)
我试过了:
use XML::Twig;
my $xml = XML::Twig->new(twig_handlers => {
'xref' => sub {$_->set_tag('#EMPTY'),},
},
pretty_print => 'indented',
);
$xml->parse('sample.xml');
$xml->print;
}
Run Code Online (Sandbox Code Playgroud)
但我无法处理它.如何在没有内容标签的情况下全面改变空标签?我该怎么改变?
对于我的生活,我无法理解实体处理的XML :: Twig文档.
我有一些用HTML :: Tidy生成的XML.电话如下:
my $tidy = HTML::Tidy->new({
'indent' => 1,
'break-before-br' => 1,
'output-xhtml' => 0,
'output-xml' => 1,
'char-encoding' => 'raw',
});
$str = "foo bar";
$xml = $tidy->clean("<xml>$str</xml>");
Run Code Online (Sandbox Code Playgroud)
产生:
<html>
<head>
<meta content="tidyp for Linux (v1.02), see www.w3.org" name="generator" />
<title></title>
</head>
<body>foo bar</body>
</html>
Run Code Online (Sandbox Code Playgroud)
XML :: Twig(可以理解)barf .我想做一些转换,通过XML :: Twig运行它:
my $twig = XML::Twig->new(
twig_handlers => {... handlers ...}
);
$twig->parse($xml);
Run Code Online (Sandbox Code Playgroud)
该$twig->parse行barfs的 ,但我无法弄清楚如何添加 元素编程.我尝试过这样的事情:
my …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用XML :: Twig解析一个大的xml文件(大约100,000条记录),但perl解析失败并出现错误:
perl.exe - Application Error:
The instruction at "0x28086920" referenced memory at "0x00000004". The memory could not be "written"...
Run Code Online (Sandbox Code Playgroud)
我读过,XML::Twig解析大型xml文件没有任何问题,但在我的情况下它失败了上述错误.
我的.pl文件有一个forloop代码,可以旋转100,000次,如下所示:
foreach my $d1(@detailData) {
if ($d1->first_child('a')->getElementsByTagName('b')) {
$id= $d1->first_child('a')->first_child('x')->field('b');
}
....
.....
......
}
Run Code Online (Sandbox Code Playgroud)
在forloop里面我有大约20个如果循环如上.它是否导致内存问题?
任何人都可以建议我如何克服这些记忆问题?
在几年前,我发现了一些Perl online,它在单行时整齐地格式化了有效的XML(标签和换行符).代码如下.
它使用XML :: Twig来做到这一点.它创建XML ::嫩枝对象而不 keep_encoding( $twig = XML::Twig->new()),但如果我给它在它的非ASCII字符UTF-8编码的XML文件时,它产生一个文件,该文件是不是有效根据isutf8命令上UTF-8 Ubuntu Linux系统.在xxd中打开文件,我可以看到字符从2字节变为1.
如果我使用我$twig= XML::Twig->new(keep_encoding=>1);的相同输入产生有效的UTF-8并保留两个字节.
根据Perldoc的keep_encoding
这是一个(稍微?)邪恶的选项:如果XML文档不是UTF-8编码并且你想保持这种方式,那么设置keep_encoding将使用Expat original_string方法作为字符,从而保持原始编码,以及字符串中的原始实体.
为什么在没有该选项的情况下生成非UTF-8文档,为什么设置它会导致保留UTF-8-ness?
顺便说一下,非ASCII字符是一个不间断的空格(c2 a0).
use strict;
use warnings;
use XML::Twig;
my $sXML = join "", (<>);
my $params = [qw(none nsgmls nice indented record record_c)];
my $sPrettyFormat = $params->[3] || 'none';
my $twig = XML::Twig->new();
$twig->set_indent(" "x4);
$twig->parse( $sXML );
$twig->set_pretty_print( $sPrettyFormat );
$sXML = $twig->sprint;
print $xXML;
Run Code Online (Sandbox Code Playgroud) 到目前为止,我发现的唯一示例代码已经很久了,它将不再起作用(使用已弃用的类).我所需要的只是一些基本的东西:
从文件加载和解析XML
定义SAX事件处理程序
读取传递给事件处理程序的元素的属性或文本值
perl ×9
xml-twig ×6
xml ×3
xml-libxml ×3
activeperl ×1
annotations ×1
java ×1
libxml2 ×1
namespaces ×1
sax ×1
tags ×1
utf-8 ×1
xml-entities ×1
xpath ×1