如何解析类似XML的文件流式文本并将其导出为CSV

时间:2019-11-18 17:17:56

标签: javascript xml csv parsing

我有一些日志文件,它们看起来像是文件流文本,其中包含c ++命名空间工件(由双冒号::提示)和XML嵌入的某些内容。我已经加载了日志并将其显示在浏览器应用程序中,该应用程序将内容与Unix时间戳分开,如下所示:

1564002293071 INFO:  ToGroundMessageFilter::addSubscriptionAddress staged subscribe address [uxas.messages.uxnative.KillSer
1564002293073 INFO:  *** INITIALIZING:: Service[ToGroundMessageFilter] Service Id[64] with working directory [] *** 
1564002293082 INFO:  WorldviewTransformationService::configure Location offsets = (lat:0, lon:0, alt:0)
1564002311397 INFO:  WatchdogManagerService::<WaypointActual Series="TACE"><Waypoint><Waypoint Series="TACE"><RemediationId>1</RemediationId><StatePlatformId>58</StatePlatformId><LatLonAlt><LatLonAlt Series="TACE"><Altitude>366</Altitude><Latitude>34.97866</Latitude><Longitude>-117.85169</Longitude></LatLonAlt></LatLonAlt><Speed>0</Speed><Heading>0</Heading><Roll>0</Roll><Pitch>0</Pitch><Yaw>0</Yaw></Waypoint></Waypoint><SenderID>68</SenderID><ActualTime>0</ActualTime><PerceivedTime>0</PerceivedTime><SenderPlatformWorld>Constructive</SenderPlatformWorld><SenderPlatformType>Other</SenderPlatformType><Comment></Comment></WaypointActual>
1564002312386 INFO:  ProximityConstraintService::<WatchdogConstraintViolation Series="TACE"><ConstraintId>-2</ConstraintId><Latching>true</Latching><Priority>1</Priority><RequestedRemediationId>1</RequestedRemediationId><HasViolation>false</HasViolation><ConstraintName>Proximity</ConstraintName><SenderID>72</SenderID><ActualTime>1564002312385</ActualTime><PerceivedTime>1564002312385</PerceivedTime><SenderPlatformWorld>Live</SenderPlatformWorld><SenderPlatformType>Air</SenderPlatformType><Comment></Comment></WatchdogConstraintViolation>

现在的预期方向是获取此日志并将其解析出来,然后使用javascript将其保存为csv。不幸的是,我不确定如何解决这个问题。 JS具有XML对象解析器。但是,如果每行的内容不是XML,该怎么办?我希望有一列用于Unix时间戳,名称空间名称和其他详细信息(请参阅底部的示例表)。

此外,我具有每个事件名称空间的格式。这里是2的示例。随着软件的更新,这些类似XML的配置会随着时间而更新。我大约定义了24种以上的XML结构化“服务”,如下所示。有没有一种方法可以使解析器根据服务名称“加载XML配置”?

WorldViewTransformationService

<AutonomyWaypointActual Series="TACE">
    <Waypoint>
        <Waypoint Series="TACE">
            <RemediationId></RemediationId>
            <StatePlatformId></StatePlatformId>
            <LatLonAlt>
                <LatLonAlt Series="TACE">
                    <Altitude></Altitude>
                    <Latitude></Latitude>
                    <Longitude></Longitude>
                </LatLonAlt>
            </LatLonAlt>
            <Speed></Speed>
            <Heading></Heading>
            <Roll></Roll>
            <Pitch></Pitch>
            <Yaw></Yaw>
        </Waypoint>
    </Waypoint>
    <SenderID></SenderID>
    <ActualTime></ActualTime>
    <PerceivedTime></PerceivedTime>
    <SenderPlatformWorld></SenderPlatformWorld>
    <SenderPlatformType></SenderPlatformType>
    <Comment></Comment>
</AutonomyWaypointActual>

ProximityConstraintService

<ProximityConstraint Series="TACE">
    <Radius></Radius>
    <OtherPlatformId></OtherPlatformId>
    <ConstraintId></ConstraintId>
    <PlatformId></PlatformId>
    <Latching></Latching>
    <Priority></Priority>
    <RequestedRemediationId></RequestedRemediationId>
    <ConstraintName></ConstraintName>
</ProximityConstraint>

输出为CSV的示例:(请注意,诸如ProximityConstraintService之类的事件不包含任何海拔,俯仰或偏航信息。

unix           |  event                         | altitude | pitch | yaw | Priority | Latching
1564002293071    ToGroundMessageFilter               -         -      -       -          -
1564002293073    INITIALIZING                        -         -      -       -          -
1564002293082    WorldviewTransformationService     100        15     4       -          -
1564002300983    WorldviewTransformationService     220        16     2       -          -
1564002312386    ProximityConstraintService          -         -      -       3          1

1 个答案:

答案 0 :(得分:0)

有多种方法可以实现。

如果您想正确地解析XML(这是正确的方法),我可能会通过两步以惰性方式完成,首先将日志文件转换为正确的XML,然后使用标准的XML解析/查询从适当的XML生成CSV的工具。

细节决定成败,所以,如果这对您不起作用,请告诉我们,但我可能会这样做:

1)grep日志仅保留我感兴趣的行;

2)将我感兴趣的所有日志消息包装到一些root标记下的一些通用logentry XML中,如下所示:

<logfile>
  ...
  <logentry timestamp="1564002311397" level="INFO" source="WatchdogManagerService">
    <WaypointActual Series="TACE"><Waypoint>...</WaypointActual>
  </logentry>
  <logentry ...>...</logentry>
  ...
</logfile>

3)使用普通的XSLT或其他处理器将生成的XML解析为CSV作为正确的XML文件。

您唯一不能做的就是自动处理这24种以上的XML格式,以便在CSV中获得正确的输出。对于每种不同的XML格式,您可能必须编写一个不同的XSLT模板,该模板适用于这种类型的logentry内容。但是随后它们都可以合并到一个XSLT文件中,因此您可以一次将单个XSLT应用于整个日志文件。