这是我遇到问题的一些代码,我处理一些XML,在OO类的方法中,我从文档中重复的几个节点中提取一个元素.每个节点的子树中应该只有一个这样的元素,但我的代码获取所有元素,就像它作为一个整体在文档上运行一样.
因为我只期望得到oine元素我只使用数组的第0个元素,这导致我的函数输出错误的值(对于文档中的所有项都是相同的)
这是一些说明问题的简化代码
$ cat t4.pl
#!/usr/bin/perl
use strict;
use warnings;
use XML::LibXML;
my $xml = <<EndXML;
<Envelope>
<Body>
<Reply>
<List>
<Item>
<Id>8b9a</Id>
<Message>
<Response>
<Identifier>55D</Identifier>
</Response>
</Message>
</Item>
<Item>
<Id>5350</Id>
<Message>
<Response>
<Identifier>56D</Identifier>
</Response>
</Message>
</Item>
</List>
</Reply>
</Body>
</Envelope>
EndXML
my $foo = Foo->new();
my $parser = XML::LibXML->new();
my $doc = $parser->parse_string( $xml );
my @list = $doc->getElementsByTagName( 'Item' );
for my $item ( @list ) {
my $id = get( $item, 'Id' );
my @messages = $item->getElementsByLocalName( …Run Code Online (Sandbox Code Playgroud) 我有一些XML文件,我想从中使用一些信息.我编写了一个代码来读取这些文件,然后查找一些条件.
问题是这些XML文件以
<SquishReport version="2.1" xmlns="http://www.froglogic.com/XML2">
Run Code Online (Sandbox Code Playgroud)
并且Perl无法读取它们(至少在我的代码中!).但是当我在XML文件的第一行附加这些行时
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl"?>
Run Code Online (Sandbox Code Playgroud)
效果很好.
我的XML文件中的一些行test.xml:
<SquishReport version="2.1" xmlns="http://www.froglogic.com/XML2">
<test name="TEST">
<prolog time="2015-10-01T03:45:22+02:00"/>
<test name="tst_start_app">
<prolog time="2015-02-01T03:45:23+02:00"/>
<message line="38" type="LOG" file="C:\squish\test\sources.py" time="2015-02-01T03:45:23+02:00">
<description>
<![CDATA[>> >> >> start: init (global) - testcase C:\squish\test\tst_start_app]]></description>
</message>
</test>
</test>
</SquishReport>
Run Code Online (Sandbox Code Playgroud)
并且用于读取XML文件的Perl代码是:
use strict;
use warnings;
use feature 'say';
use XML::LibXML;
# Parse the XML
my $xml = XML::LibXML->load_xml(location => 'test.xml');
# Iterate the entries
for my $entry ($xml->findnodes('/SquishReport/test/test')) {
my $key = $entry->findvalue('@name'); …Run Code Online (Sandbox Code Playgroud) 我想替换xml文件中元素的"VAL1"值
出于某种原因,它对我不起作用:
<testing>
<application_name>TEST</application_name>
<application_id>VAL1</application_id>
<application_password>1234</application_password>
</testing>
my $parser =XML::LibXML->new();
$tree =$parser->parse_file($xml);
$root =$tree->getDocumentElement;
my ($elem)=$root->findnodes('/testing/application_id');
$elem->setValue('VAL2');
Run Code Online (Sandbox Code Playgroud)
错误是get是"无法找到对象方法"setValue"via package"XML :: LibXML :: Element ......"
我有一个适用于iOS的旧Xcode项目,我使用了libxml2.dylib和libresolv.9.dylib.安装XCode7后.
我找不到文件,我不知道在哪里搜索.有人能帮我吗?
我是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文档中作为内部处理的一部分,但无法XML::LibXML自动缩进添加的节点.
我得到如下输出:
这是我目前得到的$xml->toString( 1 ):
<nested_nodes>
<nested_node>
<configuration>A</configuration>
<model>45</model>
<added_node>
<ID>
<type>D</type>
<serial>3</serial>
<kVal>3</kVal>
</ID>
</added_node>
</nested_node>
</nested_nodes>
Run Code Online (Sandbox Code Playgroud)
我想要的是漂亮的打印输出:
<nested_nodes>
<nested_node>
<configuration>A</configuration>
<model>45</model>
<added_node>
<ID>
<type>D</type>
<serial>3</serial>
<kVal>3</kVal>
</ID>
</added_node>
</nested_node>
</nested_nodes>
Run Code Online (Sandbox Code Playgroud)
记录$format的toString()方法的可选参数XML::LibXML::Document似乎没有帮助.
我正在cpan install XML::LibXML尝试安装XML::LibXML解析器,但它不会通过。它给出了以下错误:
cc -c -I/usr/include/libxml2 -fno-common -DPERL_DARWIN -mmacosx-version-min=10.14 -fno-strict-aliasing -pipe -fstack-protector-strong -I/usr/local/include -DPERL_USE_SAFE_PUTENV -O3 -DVERSION=\"2.0201\" -DXS_VERSION=\"2.0201\" "-I/usr/local/Cellar/perl/5.28.1/lib/perl5/5.28.1/darwin-thread-multi-2level/CORE" -DHAVE_UTF8 Devel.c
In file included from Devel.xs:28:
/usr/local/include/libxml/xmlmemory.h:16:10: fatal error: 'libxml/xmlversion.h'
file not found
#include <libxml/xmlversion.h>
^~~~~~~~~~~~~~~~~~~~~
1 error generated.
make: *** [Devel.o] Error 1
SHLOMIF/XML-LibXML-2.0201.tar.gz
/usr/bin/make -- NOT OK
Run Code Online (Sandbox Code Playgroud)
更新:
在我手动将“开发”文件复制到后/usr/local/include/libxml,file not found错误现在消失了,但仍然无法编译XML-LibXML。
更详细的信息:
Loading internal logger. Log::Log4perl recommended for better logging
Reading '/Users/chris/.cpan/Metadata'
Database was generated on Fri, 05 …Run Code Online (Sandbox Code Playgroud) 我XML::LibXML用来解析带有名称空间的XML文档。因此XML::LibXML::XPathContext,我习惯于使用findnodesXPath //u:model。这将正确返回3个节点。
我现在想findvalue在3个返回的XML::LibXML::Element对象上使用,但是无法确定有效的方法/ xpath。或者,我迭代子项并直接与nodeName匹配,但这不理想:
use strict;
use warnings;
use XML::LibXML;
use XML::LibXML::XPathContext;
my $dom = XML::LibXML->load_xml( IO => \*DATA );
my $context = XML::LibXML::XPathContext->new( $dom->documentElement() );
$context->registerNs( 'u' => 'http://www.ca.com/spectrum/restful/schema/response' );
for my $node ( $context->findnodes('//u:model') ) {
#my $mh = $node->findvalue('mh');
my ($mh)
= map { $_->textContent() }
grep { $_->nodeName() eq 'mh' } $node->childNodes();
#my $attr = $node->findvalue('attribute');
my ($attr)
= map { $_->textContent() }
grep { …Run Code Online (Sandbox Code Playgroud) 在我的 mac OS X 机器上Darwin maci 15.6.0 Darwin Kernel Version 15.6.0
我已在以下自定义目录中安装了 libxml2 和 libxslt
/usr/local/MyLibs/libxml2-2.9.2
和 libxslt
/usr/local/MyLibs/libxslt-1.1.29
现在我想使用这些库来构建我的 CPANM 模块XML::LibXSLT。
这告诉我我可以使用--configure-args(它仍然是实验性的)来做到这一点。所以我做了类似的事情,
cpanm http://search.cpan.org/CPAN/authors/id/S/SH/SHLOMIF/XML-LibXSLT-1.94.tar.gz --configure-args="--cflags=-I/usr/local/libxslt-1.1.29/include -I/usr/include/libxml2 -I/usr/local/MyLibs/libxml2-2.9.2/include/libxml2 --libs=-L/usr/local/libxslt-1.1.29/lib -lxslt -lxml2 -lz -lpthread -licucore -lm -L/usr/local/MyLibs/libxml2-2.9.2/lib -lxml2 -lz -lpthread -liconv -lm" --force
Run Code Online (Sandbox Code Playgroud)
但是,构建日志表明它没有使用我的自定义位置中安装的库。
我是否有什么做得不正确的地方?
xml-libxml ×10
perl ×9
xml ×5
xpath ×2
activeperl ×1
cpan ×1
cpanm ×1
ios ×1
libxml2 ×1
namespaces ×1
resolve ×1
xcode7 ×1