Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
逐行拆分xml_Xml_Perl - Fatal编程技术网

逐行拆分xml

逐行拆分xml,xml,perl,Xml,Perl,我有一段如下所示的xml代码,我会读入其中并用换行符将其拆分 <head> <name>states.opml</name> <Created>Tue, 15 Mar 2005 16:35:45 GMT</Created> <Modified>Thu, 14 Jul 2005 23:41:05 GMT</Modified> <owner>

我有一段如下所示的xml代码,我会读入其中并用换行符将其拆分

<head>
        <name>states.opml</name>
        <Created>Tue, 15 Mar 2005 16:35:45 GMT</Created>
        <Modified>Thu, 14 Jul 2005 23:41:05 GMT</Modified>
        <owner>Dave Winer</owner>
        <Email>dave@scripting.com</Email>
        <expansion>1, 6, 13, 16, 18, 20</expansion>
        <vertScrollState>1</vertScrollState>
        <windowTop>106</windowTop>
        <windowLeft>106</windowLeft>
        <windowBottom>558</windowBottom>
        <windowRight>479</windowRight>
        </head>

states.opml
2005年3月15日星期二16:35:45格林威治标准时间
2005年7月14日星期四23:41:05格林尼治标准时间
戴夫·温纳
dave@scripting.com
1, 6, 13, 16, 18, 20
1.
106
106
558
479
我的perl代码:

my $xml=<STDIN>;
my @head=split(/\n/,$xml);
print length(@head);
#output is 1...split is not working at all
my$xml=;
my@head=split(/\n/,$xml);
打印长度(@头);
#输出为1…拆分根本不起作用
我想要的是: 我想要的是如下所示的字符串数组:

@head={<head>,
        <name>states.opml</name>,
        <Created>Tue, 15 Mar 2005 16:35:45 GMT</Created>,
        <Modified>Thu, 14 Jul 2005 23:41:05 GMT</Modified>,
        <owner>Dave Winer</owner>,
        <Email>dave@scripting.com</Email>,
        <expansion>1, 6, 13, 16, 18, 20</expansion>,
        <vertScrollState>1</vertScrollState>,
        <windowTop>106</windowTop>,
        <windowLeft>106</windowLeft>,
        <windowBottom>558</windowBottom>,
        <windowRight>479</windowRight>,
        </head>}
@head={,
states.opml,
2005年3月15日星期二格林威治标准时间16:35:45,
2005年7月14日星期四格林尼治标准时间23:41:05,
戴夫·怀纳,
dave@scripting.com,
1, 6, 13, 16, 18, 20,
1.
106,
106,
558,
479,
}
有人能帮忙吗?我知道XML::XMLin,但不允许使用它

谢谢

实际上正在按应有的方式工作。您只在
$xml
中读取了一行,因此
split
只返回一行。如果要将文件slurp转换为标量
$xml
,则需要拆分,并且此代码可以工作:

local $/ = undef;   # set input record separator to undef (instead of newline)
my $xml=<STDIN>;    # all lines are now in $xml
my @head=split(/\n/,$xml);    # so now we can split it
它打印数组大小的长度,即1
@head
在标量上下文中作为字符串计算,字符串“1”的长度为1。你要找的只是:

print scalar @head;
但是为什么要这么麻烦呢?只要做:

my @head = <STDIN>;   # all the lines are now in @head
print scalar @head;

问题是站点上的文件使用传统的Mac OS编码,它使用
CR
作为行分隔符

输入记录分隔符
$/
的正常设置将
LF
字符上的行分隔开,由于文件中没有任何行,因此一次读取所有行

解决此问题的传统方法是写入
local$/=“\r”
,之后相同范围内的文件读取语句将以
CR
字符终止。另外,
chomp
将从行尾删除一个
CR

但是,如果您同时从多个具有不同行终止符的文件中读取数据,这可能会很尴尬,因为它会影响
操作符,而不是特定的文件句柄


我遇到的处理这个问题的最简洁的方法是安装模块,它允许您以
模式打开任何文件。我通过“$./read”输入文件。pl@user1391821
不是(实际上)用于数组,而是用于散列。尽管在最新版本的perl中,它可以用于数组获取索引。您根本不需要循环,只需执行
print@head
,因为print可以将列表作为参数。如果避免删除换行符(使用
chomp
split
)早些时候,你会得到一个很好的打印。我使用的文件来自本网站的示例,如果我复制xml文本并自己保存它,代码就可以工作。如果我使用
将链接文件另存为
直接下载opml文件,无论我做什么,它总是在一行中进行,并且拆分不起作用,那么我想这些文件之间存在一些差异。你应该投资igate这是什么区别。为什么?如果要处理XML,为什么不将其作为XML处理,而不是将其转换为另一种格式,为此您必须编写一个解析器?@mirod是正确的。此解决方案对源数据的更改非常脆弱。例如,XML规范中的任何内容都不会阻止整个XML文件的更改出现在一行上……似乎是某个类的任务。没有实际的方法,只是测试基本技能,现在它正确地拆分为数组,但仍然无法打印到控制台
local$/=“\r”;my@xml=;print@xml;print“\n”
它给出了“ext=”Texas“/>co“/>a”/>created=”Tue,2005年7月12日23:56:47 GMT“/>“。那么我如何打印这样编码的文件呢?我仍然建议使用
PerlIO::eol
,但是如果你坚持修改
$/
,那么你必须考虑
@xml
中以
CR
结尾的行,而不是
LF
。你可以
选择它们并添加
”\n”
在每一行后面写
local$/=“\r”;my@xml=;chomp@xml;打印“$\un”表示@xml;
。但是使用模块,您需要的只是
binmode STDIN':raw:eol(LF);@xml=;print@xml;
my @head = <STDIN>;   # all the lines are now in @head
print scalar @head;
chomp(my @head = <STDIN>);