我试图将wireshark xml输出文件(pdml)的一些输出转换为csv文件。
我想选择属性名称= jen的proto元素。那个xml应该有一个名为field的子元素,其中show =" Discovery JEN :: Item1"。从我想要的那个节点
数据包将以下内容从以下xml复制到一行进行。
我之前写了一点xslt。但这超出了我的范围。
我意识到我会编写类似下面的内容来至少匹配协议模板。进入内部后,我知道我需要选择字段元素,但我需要再次根据属性进行选择。对不起,我所尝试的是如此稀少。我在这一点上真的输了。
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="packet/proto[@name="jen]">
<xsl:copy>
<xsl:apply-templates select="*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="field[@show='Discovery OMName: JEN-Item1-v4 OMTypeName: JEN::Item1']">
<xsl:value-of select="@show"/>
</xsl:template>
<xsl:template match="field[@show='item1ID']">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="field[@show='JEN Update Header']">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="field[@show='MIPSI mipsi']">
<xsl:template match="field[@show='Time time']">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:template>
</xsl:stylesheet>
XML示例
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="pdml2html.xsl"?>
<pdml version="0" creator="wireshark/1.10.10" time="Mon Oct 20 16:46:32 2014" capture_file="C:\Users\someone\Documents\ABC\Test Files\ToSave\Item1_multicast.pcapng">
<packet>
<proto name="jen" showname="JEN" size="501" pos="134">
<field name="" show="Header Data" size="0" pos="134" value="">
<field name="" show="TAO RTEC Event Header" size="0" pos="134" value="">
<field name="" show="Number Of Events: 1" size="4" pos="134" value="01000000"/>
<field name="" show="EventType: ReflectionMessageEvent_t" size="4" pos="142" value="e8030000">
<field name="jen.eventType" showname="Event Type: 30" size="4" pos="280" show="30" value="1e000000"/>
</field>
</field>
<field name="jen.payloadtype" showname="Payload Type: 0" size="4" pos="218" show="0" value="00000000"/>
</field>
<field name="" show="Discovery OMName: JEN-Item1-v4 OMTypeName: JEN::Item1" size="8" pos="426" value="3421836700000000"/>
<field name="" show="Discovery JEN::Item1" size="0" pos="434" value="">
<field name="" show="item1ID" size="0" pos="442" value="">
<field name="" show="LCMI" size="1" pos="442" value="73"/>
<field name="" show="siteID: 0" size="2" pos="444" value="0000"/>
<field name="" show="applicationID: 0" size="2" pos="446" value="0000"/>
<field name="" show="objectID: 1" size="4" pos="450" value="01000000"/>
</field>
<field name="" show="JEN Update Header" size="0" pos="476" value="">
<field name="" show="ODS ID" size="0" pos="476" value="">
<field name="jen.ods.hostip" showname="HostIP: 192.168.111.72 (192.168.111.72)" size="4" pos="478" show="192.168.111.72" value="c0a86f48"/>
<field name="jen.ods.process" showname="ProcessID: 9588" size="4" pos="482" show="9588" value="74250000"/>
<field name="jen.ods.time" showname="Process Create Time Sec: 1396466786" size="4" pos="486" show="1396466786" value="62643c53"/>
<field name="jen.ods.counter" showname="counter: 2" size="4" pos="490" show="2" value="02000000"/>
</field>
</field>
<field name="" show="JEN::Item1 0-0-1" size="0" pos="530" value="">
<field name="" show="length: 81" size="4" pos="534" value="51000000"/>
<field name="" show="JENAffiliation affiliation=Affiliation_Unknown" size="4" pos="542" value="00000000"/>
<field name="" show="MIPSI mipsi" size="0" pos="554" value="">
<field name="" show="LCMI" size="1" pos="554" value="73"/>
<field name="" show="Optional Attribute Bit Set" size="1" pos="555" value="00"/>
<field name="" show="Time time" size="0" pos="556" value="">
<field name="" show="nanosecondsSince1970: 1396466786788509000" size="8" pos="562" value="480529cf243f6113"/>
</field>
</field>
</field>
</proto>
</packet>
</pdml>
Desired输出看起来像下面的
Discovery OMName:JEN-Item1-v4 OMTypeName:JEN :: Item1,siteID:0 applicationID:0 objectID:1,HostIP:192.168.111.72(192.168.111.72)ProcessID:9588 Process Create Time Sec:1396466786 counter:2 ,nanosecondsSince1970:1396466786788509000
答案 0 :(得分:2)
第一件事:如果您希望输出为CSV,则将输出方法设置为“text”,并且不要复制源XML的元素。
以下是您可以用作起点的内容:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8"/>
<xsl:template match="/">
<xsl:for-each select="pdml/packet/proto[@name='jen']">
<xsl:text>Discovery OMName: JEN-Item1-v4 OMTypeName: JEN::Item1,</xsl:text>
<xsl:text>item1ID,</xsl:text>
<xsl:for-each select="field[@show='item1ID']/field">
<xsl:value-of select="@show"/>
<xsl:text>,</xsl:text>
</xsl:for-each>
<!-- more of the same -->
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
应用于您的输入(在纠正格式错误的部分后!),返回:
Discovery OMName: JEN-Item1-v4 OMTypeName: JEN::Item1,item1ID,LCMI,siteID: 0,applicationID: 0,objectID: 1,
我认为剩下的应该是非常明显的。