这是我遇到问题的一些代码,我处理一些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( …我有一些XML文件,我想从中使用一些信息.我编写了一个代码来读取这些文件,然后查找一些条件.
问题是这些XML文件以
   <SquishReport version="2.1" xmlns="http://www.froglogic.com/XML2">
并且Perl无法读取它们(至少在我的代码中!).但是当我在XML文件的第一行附加这些行时
   <?xml version="1.0" encoding="UTF-8"?>
   <?xml-stylesheet type="text/xsl"?>
效果很好.
我的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>
并且用于读取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'); …我想替换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');    
错误是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;
...
然后我收到这个错误:
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');   
然后我尝试访问一个名为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" ;
}
但只有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>
我想要的是漂亮的打印输出:
                            <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>
记录$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
更新:
在我手动将“开发”文件复制到后/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 …我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  { …在我的 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
但是,构建日志表明它没有使用我的自定义位置中安装的库。
我是否有什么做得不正确的地方?
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