在匹配模式时需要帮助来提取xml代码的开始到结束标记。 例如,我在我的xml文件中有这个:
global
在此示例中,我的模式将是客户端IP - 10.10.11.201。
我在多个xml文件中查找某些IP并且标签不统一,有些线路比其他线路更多 - 因此,我不能将“grep”与-B或-A一起使用,因此,基础应该是开始标记 <entry>
<log_time>20150618-00:06:30</log_time>
<description><![CDATA[Connection established]]></description>
<service>SSH</service>
<sessionid>02881141</sessionid>
<type>0</type> <severity>0</severity>
<lstnconnaddr>10.10.10.100:22</lstnconnaddr>
<cliconnaddr>10.10.11.201:63530</cliconnaddr>
<sguid>04AD6AD5-FB2E-4F03-7993-447648CC3EED</sguid>
</entry>
<entry>
<log_time>20150618-00:06:30</log_time>
<description><![CDATA[Sent server version: SSH-2.0-0]]></description>
<service>SSH</service>
<sessionid>08878297</sessionid>
<type>0</type> <severity>1</severity>
<lstnconnaddr>10.10.10.100:22</lstnconnaddr>
<cliconnaddr>10.10.11.201:63529</cliconnaddr>
<sguid>04AD6AD5-FB2E-4F03-7993-447648CC3EED</sguid>
</entry>
<entry>
<log_time>20150616-00:00:00</log_time>
<description><![CDATA[SSH Transport agreed algorithms
Key exchange algorithm: diffie-hellman-group14-sha1
Server host key algorithm: ssh-rsa
Client encryption algorithm: aes256-ctr
Client MAC algorithm: hmac-sha1
Client compression algorithm: none
Client language:
Server encryption algorithm: aes256-ctr
Server MAC algorithm: hmac-sha1
Server compression algorithm: none
Server language:
]]></description>
<service>SSH</service>
<sessionid>48018549</sessionid>
<type>0</type> <severity>1</severity>
<lstnconnaddr>10.10.10.100:22</lstnconnaddr>
<cliconnaddr>10.10.11.201:60580</cliconnaddr>
<sguid>04AD6AD5-FB2E-4F03-7993-447648CC3EED</sguid>
</entry>
以结束标记<>
以获取该IP的整个事务。
让我试着更好地把我正在寻找的东西。例如,我正在寻找10.10.11.201的行:
</>
找到后,我需要整个开始结束标记:
<cliconnaddr>10.10.11.201:63529</cliconnaddr>
最好使用bash,awk,sed,perl。
谢谢!
答案 0 :(得分:2)
您可以使用XML::Twig来执行此操作。基本上,这将创建一个将为每个for()
元素调用的处理程序,抓取父级并打印它。
$query = "SELECT pro_id, pro_page from tbl_checkout";
$result = mysqli_query($c,$query)or die(mysqli_error($c));
$length = mysqli_num_rows($result);
while($row = mysqli_fetch_array($result1))
{
$pro_id[] = $row["pro_id"];
$pro_page[] = $row['pro_page'];
}
for($i=0; $i<$length1; $i++)
{
// don't assign to $pro_id and $pro_page as variable name: it will mess up your data!
$tmp_id = explode(",", $pro_id[$i]);
$tmp_page = explode(",", $pro_page[$i]);
for($c=0; $c < count($tmp_id)) {
echo $tmp_id[$c];
echo $tmp_page[$c];
}
}
答案 1 :(得分:0)
如果我做得对,您要做的是:按<entry>
的值过滤您的<cliconnaddr>
元素列表。对我来说,这有点像XSLT!
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:h="http://www.w3.org/1999/xhtml">
<xsl:output encoding="UTF-8" method="xml" version="1.0" indent="yes"/>
<!-- Catch-all templates -->
<xsl:template match="@*|text()">
<xsl:copy-of select="."/>
</xsl:template>
<xsl:template match="*">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/">
<xsl:apply-templates select="@*|node()"/>
</xsl:template>
<xsl:template match="processing-instruction()">
<xsl:copy/>
</xsl:template>
<!-- specific part -->
<xsl:template match="entry[cliconnaddr[text()!='10.10.11.201:63529']]"/>
</xsl:stylesheet>
这个XSLT的作用是:复制除<cliconnaddr>
没有值为“10.10.11.201:63529”的条目以外的所有内容。由于这是一个XSLT 1.0,因此很容易找到在您的上下文中运行的XSLT处理器。