逐行拆分xml
我有一段如下所示的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>
<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>);