Nipper studio XML parser


<section index="2.3" title="No HTTP(S) Server Session Timeout or HTTP(S) Server Idle Timeout Set" ref="ADMINISTRATION.WEBTIMEOUT.NO.HTTP.OR.HTTPS.SESSION.OR.IDLE.TIMEOUT.four">
<issuedetails>
<devices>
<device name="Switch" type="Cisco Catalyst Switch" osversion="16.3" />
</devices>
<ratings type="Nipperv1">
<rating>High</rating>
<impact>Critical</impact>
<ease>Easy</ease>
<fix>Quick</fix>
<FindingID>NSA-ADMIN-046</FindingID>
<classif>Administration</classif>
</ratings>
</issuedetails>
<section index="2.3.1" title="Finding" ref="FINDING">
</section>
<section index="2.3.4" title="Recommendation" ref="RECOMMENDATION">
<text>Nipper Studio recommends that a HTTP(S) server session timeout period of 10 minutes or less should be configured.</text>
<text>Notes for Cisco Catalyst Switch devices:</text>
<text>The HTTP server timeout can be configured with the following command:<code><command>ip http timeout-policy idle <cmduser>seconds</cmduser> life <cmduser>seconds</cmduser> requests <cmduser>number</cmduser></command>
</code>
</text>

XML解析器:

$commands = $section->xpath('section[4]/text/code/command');
$object->commands = "";
foreach($commands as $command)
{
$object->commands .=  $command;
$cmdusers = $command->xpath('cmduser');
foreach($cmdusers as $cmduser){
$object->commands .=  $cmduser;
}
$object->commands .=  "<br>";
}
echo "commands : <br>".$object->commands;
echo "<be>";

输出:

ip http timeout-policy idle seconds life seconds requests number

但它就像这个

ip http timeout-policy idle life requests secondssecondsnumber

您已经看到您的期望与实际结果不匹配。

这只是SimpleXML的一个限制;错误的工作工具";类别但请继续阅读,它是多功能的。

让您感到困难的是,您使用的XML的SimpleXML解析器的结构不太适合它——至少在这里是这样。

有问题的部分是查找跨多个元素节点的文本数据。

cOle2:在回答中使用嵌套标签回声xml文件的内容所述

当前您的$output是一个SimpleXMLElement,当您回显它时,会调用内部的toString((方法。根据注释,此方法不会返回此元素的子元素内部的文本内容,这就是排除某些文本的原因。

在使用SimpleXML的同时获得文本内容的一种方法是使用DOM姊妹库,这与我对另一个问题的回答类似,它是一个简单的导入操作,然后获取属性:

$commands = $section->xpath('section[4]/text/code/command');
$object->commands = "";
foreach($commands as $command)
{
$object->commands .=  dom_import_simplexml($command)->textContent;
^^^^            ^^^         ^^^^
...

根据经验,SimpleXML在XML文本节点方面很弱。它的API中没有任何特别的内容,字符串值表示叶元素节点文本内容。其他元素节点字符串内容可能看起来不完整和排序错误,就像你可能会经历的那样

在这种情况下,您可以只使用一个XPath:

$commands = $section->xpath('section[4]/text/code/command//text()');

最新更新