来自以下文件XML::Simple:
不鼓励在新代码中使用此模块.其他模块可用,提供更直接和一致的接口.特别强烈建议使用XML :: LibXML.
该模块的主要问题是大量选项以及这些选项交互的任意方式 - 通常会产生意外结果.
有人可以为我澄清一下这主要原因是什么?
在过去的两个小时左右,我一直在尝试在Ubuntu 12.10上安装XML :: Simple,并且已经正式用完了想法.它在XML :: Parser中失败了.
我做了一个
sudo apt-get install expat
Run Code Online (Sandbox Code Playgroud)
它仍然无法正常工作.这是我得到的错误:
make[1]: Entering directory `/home/<user>/.cpan/build/XML-Parser-2.41-MCLo7T/Expat'
cp Expat.pm ../blib/lib/XML/Parser/Expat.pm
/usr/bin/perl /usr/share/perl/5.14.2/ExtUtils/xsubpp -noprototypes -typemap /usr/share /perl/5.14/ExtUtils/typemap -typemap typemap Expat.xs > Expat.xsc && mv Expat.xsc Expat.c
cc -c -D_REENTRANT -D_GNU_SOURCE -DDEBIAN -fstack-protector -fno-strict-aliasing -pipe -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -O2 -g -DVERSION=\"2.41\" -DXS_VERSION=\"2.41\" -fPIC "-I/usr/lib/perl/5.14/CORE" Expat.c
Expat.xs:12:19: fatal error: expat.h: No such file or directory
compilation terminated.
make[1]: *** [Expat.o] Error 1
make[1]: Leaving directory `/home/sclarawu/.cpan/build/XML-Parser-2.41-MCLo7T/Expat'
make: *** [subdirs] Error 2
TODDR/XML-Parser-2.41.tar.gz
/usr/bin/make -- …Run Code Online (Sandbox Code Playgroud) 关于设置返回的XML元素的顺序,我已经在各个地方看到了很少的答案XMLout.但是,我无法使用这些答案/示例解决问题.
我有一个需要输出一些XML数据的脚本,某些元素需要按特定顺序打印.哈希是相当复杂的,我是不是能够通过覆盖达到任何结果sorted_keys的XML::Simple对象.嗯,我做了,但不是我想要的方式.
示例代码如下,问题的详细信息在代码下方.
#!/usr/bin/perl
use strict;
use warnings;
use XML::Simple;
package MyXMLSimple;
use base 'XML::Simple';
sub sorted_keys
{
my ($self, $name, $hashref) = @_;
# ...
return $self->SUPER::sorted_keys($name, $hashref);
}
package main;
my $xmlParser = MyXMLSimple->new;
my $items = {
'status' => 'OK',
'fields' => {
'i1' => {
'header' => 'Header 1',
'max_size' => '3'
},
'i2' => {
'header' => 'Header 2',
'max_size' => '8'
}
},
'item_list' => {
'GGG' => …Run Code Online (Sandbox Code Playgroud) 我有以下xml文件
<?xml version="1.0"?>
<!DOCTYPE pathway SYSTEM "http://www.kegg.jp/kegg/xml/KGML_v0.7.1_.dtd">
<pathway name="path:ko01200" org="ko" >
<entry id="1" >
<graphics name="one"
type="circle" />
</entry>
<entry id="7" >
<graphics name="one"
type="rectangle" />
<graphics name="two"
type="rectangle"/>
</entry>
</pathway>
Run Code Online (Sandbox Code Playgroud)
我厌倦了使用xml简单解析它与下面的代码我被卡住,因为其中一个节点有2个图形元素.所以它抱怨.我假设我必须有另一个foreach循环的图形元素,但我不知道如何继续.
use strict;
use warnings;
use XML::Simple;
use Data::Dumper;
my $xml=new XML::Simple;
my $data=$xml->XMLin("file.xml",KeyAttr => ['id']);
print Dumper($data);
foreach my $entry ( keys %{$data->{entry}} ) {
print $data->{entry}->{$entry}->{graphics}->{type}."\n";
}
Run Code Online (Sandbox Code Playgroud)
这是代码结果
$VAR1 = {
'entry' => {
'1' => {
'graphics' => {
'name' => 'one...',
'type' => 'circle'
} …Run Code Online (Sandbox Code Playgroud) 我正在使用XML Simple来解析XML文件,有问题的部分看起来像这样:
<textBody>
<title>
<titlePart>
<text>SECTION A <emdash/> HUMAN NECESSITIES</text>
</titlePart>
</title>
</textBody>
<ipcEntry kind="t" symbol="A01" ipcLevel="C" entryType="K" lang="EN">
<textBody>
<title>
<titlePart>
<text>AGRICULTURE</text>
</titlePart>
</title>
</textBody>
</ipcEntry
Run Code Online (Sandbox Code Playgroud)
出于某种原因,XML :: Simple完全忽略了<text>SECTION A <emdash/> HUMAN NECESSITIES</text>
我猜它因为emdash标签,因为<text>AGRICULTURE</text>解析得很好.我还尝试通过以下方式设置解析器:
$XML::Simple::PREFERRED_PARSER = 'XML::Parser';
Run Code Online (Sandbox Code Playgroud)
仍然没有去.任何的想法?
以下是我将使用的XML:
<a>
<id>ABC</id>
<class />
<gender />
</a>
我想编写一个Perl代码,用于搜索标签'id'并将值"ABC"替换为"DEF".
但是,上述XML的嵌套可能会发生变化.因此,我想制作一个通用代码,独立于其确切位置搜索标签'id'.
直到现在我能够获得逻辑,我可以替换ABC中的值,但这使我的代码静态标记'id'的位置.
#!usr/bin/perl
use warnings;
use XML::Simple;
use Spreadsheet::ParseExcel;
use Data::Dumper;
my $FileName = 'sample.xls';
my $xml_file = 'hello.xml';
$par=$ARGV[0];
my $xml = XMLin($xml_file,
KeepRoot=>1,
ForceArray=>1,);
$xml->{a}->[0]->{id}='DEF';
XMLout(
$xml,
KeepRoot =>1 ,
NoAttr =>1,
OutputFile => $xml_file,
);
}
Run Code Online (Sandbox Code Playgroud) 我做了这样的练习,如何通过XML :: Simple计算折叠成数组的XML元素的数量,这样我就不必对元素进行硬编码了?我计划使用代码来解析更大的xml文件.我不想通过手册来讨论这些元素.
我可以使用一些计数来代替幻数,有点像person.count或hobbie.length等.我知道,我可以在C#中方便地使用这种说法.
#!/usr/bin/perl -w
use strict;
use XML::Simple;
use Data::Dumper;
my $tree = XMLin('./t1.xml');
print Dumper($tree);
print "\n";
for (my $i = 0; $i < 2; $i++) # magic number '2'
{
print "$tree->{person}->[$i]->{first_name} $tree->{person}->[$i]->{last_name}\n";
print "\n";
for (my $j = 0; $j < 3; $j++) # magic number '3'
{
print $tree->{person}->[$i]->{hobbie}->[$j], "\n";
}
print "\n";
}
Run Code Online (Sandbox Code Playgroud)
出局:
could not find ParserDetails.ini in C:/Perl/site/lib/XML/SAX
$VAR1 = {
'person' => [
{
'hobbie' => …Run Code Online (Sandbox Code Playgroud) 我使用XML :: Simple来解析和编辑一个非常大的XML文件,速度是必不可少的(到目前为止,我已经尝试过所有方法的XML :: Simple是最快的)
现在,一旦我的所有编辑完成,我使用XMLout()将XML打印到文档,尽管它使用适当的缩进打印它,如果这是人类读取但在我的情况下完全没用的话.
没有空格的输出文件是1.2 Mb,白色空间是15 Mb.
我一直在使用:
my $string = XMLout($data);
$string =~ s/>[\s]*</></g;
print $out $string;
Run Code Online (Sandbox Code Playgroud)
但它似乎不仅是一个极端的CPU占用并且需要大量的内存.
他们是一种简单地将我的XML对象作为正确的XML输出而没有所有无用空白的方法吗?
谢谢
我正在尝试运行Perl脚本以将xml文档的所有元素都放入数组中.代码如下:
#!/usr/bin/perl
# Script to illustrate how to parse a simple XML file
# and dump its contents in a Perl hash record.
use strict;
use XML::Simple;
my $xs = new XML::Simple();
my $booklist = $xs->XMLin('./cmn_msg.xml');
print Dumper($data);
Run Code Online (Sandbox Code Playgroud)
当我运行此代码时,我收到一个错误:
Use of tied on a handle without * is deprecated at C:/Perl/lib/XML/Parser/Expat.pm line 447.
not well-formed (invalid token) at line 4, column 14, byte 128 at C:/Perl/lib/XML/Parser.pm line 187
Run Code Online (Sandbox Code Playgroud)
我正在使用为MSWin32-x86-multi-thread构建的ActivePerl(v5.14.1).我试图在Win7上运行此脚本.
所以我有一些像这样的xml文件:
<?xml version="1.0" encoding="ISO-8859-1"?>
<root result="0" >
<settings user="anonymous" >
<s n="blabla1" >
<v>true</v>
</s>
<s n="blabla2" >
<v>false</v>
</s>
<s n="blabla3" >
<v>true</v>
</s>
</settings>
</root>
Run Code Online (Sandbox Code Playgroud)
我想使用XML Simple进行所有设置.
这是我使用Data :: Dumper打印输出时的内容:
$VAR1 = {
'settings' => {
'user' => 'anonymous',
's' => [
{
'n' => 'blabla1',
'v' => 'true'
},
{
'n' => 'blabla2',
'v' => 'false'
},
{
'n' => 'blabla3',
'v' => 'true'
}
]
},
'result' => '0'
};
Run Code Online (Sandbox Code Playgroud)
这是我的代码
$xml = new XML::Simple;
$data …Run Code Online (Sandbox Code Playgroud)