Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.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
Regex 从XML结束标记填充数组_Regex_Perl_Xml Parsing - Fatal编程技术网

Regex 从XML结束标记填充数组

Regex 从XML结束标记填充数组,regex,perl,xml-parsing,Regex,Perl,Xml Parsing,我正在尝试创建一个字段名数组,以便稍后在脚本中使用。正则表达式正在踢我的屁股。我很久没有写代码了。字段名嵌入在XML标记中,因此我想我可以从第一行数据的结束标记中提取它们。我看不到如何正确填充阵列……有人能帮我解释一下吗 my $firstLineOfXMLFile = <record>DEFECT000179<\record><state>Approved<\state><title>Something is broken<\t

我正在尝试创建一个字段名数组,以便稍后在脚本中使用。正则表达式正在踢我的屁股。我很久没有写代码了。字段名嵌入在XML标记中,因此我想我可以从第一行数据的结束标记中提取它们。我看不到如何正确填充阵列……有人能帮我解释一下吗

my $firstLineOfXMLFile = <record>DEFECT000179<\record><state>Approved<\state><title>Something is broken<\title>

my @fieldNames = $firstLineOfXMLFile =~ m(<\(.*)>)g; #problem, can't seem to grab the text within the end tags.

print @fieldNames;
my$firstLineOfXMLFile=defect000179approved有些东西坏了
my@fieldNames=$firstLineOfXMLFile=~m()g#问题是,似乎无法抓取结束标记中的文本。
打印@fieldNames;
非常感谢!
-Matt

您的示例数据不是XML。你的斜线是向后的。假设您要解析的是XML,答案是“不要使用正则表达式”

他们根本无法处理递归和嵌套到必要的程度

因此,记住这一点-假设您的示例数据实际上是格式良好的XML,这是一个输入错误,类似于
XML::Twig
的东西将非常方便地完成这一任务:

#!/usr/bin/env perl
use strict;
use warnings;

use XML::Twig;

my $twig = XML::Twig -> parse ( \*DATA );

#extract a single field value
print $twig -> root -> first_child_text('title'),"\n";
#get a field name
print $twig -> root -> first_child -> tag,"\n";
#can also use att() if you have attributes


print "Field names:\n";
#children() returns all the children of the current (in this case root) node
#We use map to access all, and tag to read their 'name'. 
#att or trimmed_text would do other parts of the XML. 
print join ( "\n", map { $_ -> tag } $twig -> root -> children );

__DATA__
<XML>
<record>DEFECT000179</record><state>Approved</state><title>Something is broken</title>
</XML>
您还可以使用各种其他非常有用的工具,例如用于格式化输出XML的
pretty_print
twig_处理程序
,它们可以在解析时操作XML(尤其适用于
清除
),
剪切
粘贴
来移动节点,和
get_xpath
,让您可以使用xpath表达式根据路径和属性查找元素

编辑:根据注释,如果您确实想从以下位置提取数据:

</something>
或者是一个非reedy匹配:

m,</(.*?)>,g
m,,g
哦,考虑到你有一个反斜杠,你需要避开它:

my $firstLineOfXMLFile = '<record>DEFECT000179<\record><state>Approved<\state><title>Something is broken<\title>';
my @fieldNames = $firstLineOfXMLFile =~ m(<\\(.*?)>)g;
print @fieldNames;
my$firstLineOfXMLFile='DEFECT000179ApprovedSomething is breaked';
my@fieldNames=$firstLineOfXMLFile=~m()g;
打印@fieldNames;

我会成功的。(但说真的-故意创建看起来不像XML的东西是一件非常糟糕的事情)

您的源文件真的有带斜杠的结束标记吗?嗨,Andy,我可以随意创建斜杠和标记,因为我可以控制从数据库中转储此数据的脚本。在导出过程中,我提供了分隔符,并认为提供类似XML的分隔符(实际上只是字段名)将有助于以后解析数据。导出文件不是真正的XML。我只是觉得它离你们很近,可以给你们一个想法,而不必用信息轰炸你们。我真傻,犯了这么一个基本的错误。等等。。。数据已经在数据库里了?!为什么我们不从这里开始,而不是通过这个中间的hocus pocus?是的,数据从ClearQuest数据库导出到上面显示的格式,传输到另一个网络,然后上传。我实际上正在编写导入脚本,第一步是解析导出文件的第一行,用字段名填充数组。一旦我有了字段名,我就可以在我的SQL insert语句中使用它们。如果有可用的解析器,XML将是一个很好的DB输出。既然你没有,你还有其他选择吗?设置一个分隔符并像逗号分隔符一样处理它可能会更好,因为这样就不需要标记匹配。Sobrique,我可以访问的PERL版本(cqperl)是IBM ClearQuest安装的一部分,列为5.8.6版。有人告诉我这个版本已经精简了,我可以看到没有包含XML:Twig包。出于合同安全的原因,我无法轻松地更新PERL包。我的第一个问题变得很尴尬,因为我没有很好地阐述我的问题并提供重要的细节。我为此道歉。我基本上有一个测试文件,其中包含数百条这种格式的记录:Cool,一个11年前的Perl版本!是的,先生,我爸爸仍然开着他的1969吉普车:)是的,好的。我知道怎么回事。但是,
regex
仍然是这个工作的错误工具。请参阅:-HTML/XML基本上比
regex
支持的更复杂。我建议对一个新的(er)perl和几个库提出更改请求是正确的做法,因为regex充其量只是一个肮脏的黑客。(但有时黑客攻击是唯一的选择:/)
m,</(.*?)>,g
my $firstLineOfXMLFile = '<record>DEFECT000179<\record><state>Approved<\state><title>Something is broken<\title>';
my @fieldNames = $firstLineOfXMLFile =~ m(<\\(.*?)>)g;
print @fieldNames;