2014-11-04 67 views
0

我正在为perl中的Ossec规则文件编写解析器。Perl解析格式不正确的XML文件

我使用XML :: Simple,它一般工作正常,但有些规则文件的问题是畸形的,而不是顶级<group> <\group>有几个。

我已阅读perlfaq:http://perldoc.perl.org/perlfaq6.html#How-can-I-pull-out-lines-between-two-patterns-that-are-themselves-on-different-lines%3f

我可以使用例如,有匹配的文本,但所有的比赛分组。

CLI的代码,我有这个操作是:

perl -ne 'print if /^<group name/ .. /^<\\group>/' attack_rules.xml 

如何分隔不同的比赛吗?

这里是一个示例XML格式不正确:

<!-- Privilege scalation messages --> 
<group name="syslog,elevation_of_privilege,"> 
    <rule id="40501" level="15" timeframe="300" frequency="2"> 
    <if_group>adduser</if_group> 
    <if_matched_group>attacks</if_matched_group> 
    <description>Attacks followed by the addition </description> 
    <description>of an user.</description> 
    </rule> 
</group> <!-- SYSLOG, ELEVATION_OF_PRIVILEGE, --> 



<!-- Scan signatures --> 
<group name="syslog,recon,"> 
    <rule id="40601" level="10" frequency="10" timeframe="90" ignore="90"> 
    <if_matched_group>connection_attempt</if_matched_group> 
    <description>Network scan from same source ip.</description> 
    <same_source_ip /> 
    <info type="link">http://project.honeynet.org/papers/enemy2/</info> 
    </rule> 
</group> <!-- SYSLOG,SCANS --> 
+3

难道你不能把整个内容包装到' ...'? – choroba 2014-11-04 21:13:44

+0

像从文件句柄加载文件到变量并在开始和结束时连接字符串?这听起来可行 – Bruno9779 2014-11-04 21:16:34

+0

我正在用这个解决方案。其实我要加载所有文件为FH,并在每个文件中包裹“root”,这样我就避免了我一直使用的丑陋系统(xmllint $文件)。 如果您在答案中编写此解决方案,我会接受它 – Bruno9779 2014-11-04 21:21:16

回答

1

如果唯一的问题是“重根”,你可以换一个<root>...</root>每个文件的内容,并解析结果。

相关问题