使用 powershell 将 soap 日志文件转换为 csv

convert soap log file to csv using powershell

我一直在寻找一种使用 powershell 将日志文件转换为 csv 的好方法,以便我可以将数据正确导入 Teradata。我以前从未见过这样的文件,所以我将尽力解释。

这是日志文件中的示例

[XXXXX:11aa11a-123-12a4-12a3-12323aabb123:4] 2021-02-05 00:00:00,000: [DEBUG] Somesystem::Request:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
  <soapenv:Header>
    <ctx:App xmlns:ctx="http://namespace">
      <ctx:Session>
        <ctx:UN>XXXXX</ctx:UN>
        <ctx:SId>11aa11a-123-12a4-12a3-12323aabb123</ctx:SId>
        <ctx:Creation>2021-02-05T00:00:00+11:00</ctx:Creation>
      </ctx:Session>
      <ctx:IC>
        <ctx:TId>11aa1aa-1aa1-2a22-3aa1-aa1b1233456</ctx:TId>
        <ctx:Call>
          <ctx:BI>13</ctx:BI>
          <ctx:CN>Somesystem</ctx:CN>
        </ctx:Call>
        <ctx:Call>
          <ctx:BI>1</ctx:BI>
        </ctx:Call>
        <ctx:Call>
          <ctx:BI>1</ctx:BI>
        </ctx:Call>
        <ctx:Call>
          <ctx:BI>1</ctx:BI>
        </ctx:Call>
        <ctx:Call>
          <ctx:BI>1</ctx:BI>
          <ctx:CN>Somesystem</ctx:CN>
          <ctx:CL>UnknownLocation</ctx:CL>
        </ctx:Call>
        <ctx:Call>
          <ctx:BI>0</ctx:BI>
        </ctx:Call>
      </ctx:IC>
    </ctx:App>
    <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
      <wsse:UT>
        <wsse:UN>SomesystemUSR</wsse:UN>
        <wsse:P>Somepassword</wsse:P>
      </wsse:UT>
    </wsse:Security>
  </soapenv:Header>
  <soapenv:Body>
    <ns5:ListRequest xmlns:ns5="http://Namespace/Service/V1.0" xmlns="http://www.immi.gov.au/Namespace/Enterprise/ErrorMessages/V1.0" xmlns:ns6="http://Namespace/Core/V1.0" xmlns:ns8="http://Namespace/Service/V1.0" xmlns:ns7="http://Namespace/Core/V1.0" xmlns:ns9="http://Namespace/Core/V1.0"
      xmlns:ns10="http://Namespace/Core/Messaging/V1.0" xmlns:ns2="http://Namespace/Enterprise/V1.0" xmlns:ns4="http://Namespace/Core/V1.0" xmlns:ns3="http://Namespace/WarningMessages/V1.0">
      <ns4:FromDate>2021-01-28</ns4:FromDate>
      <ns4:ToDate>2021-01-28</ns4:ToDate>
      <ns4:Code>0123</ns4:Code>
      <ns4:Type>U</ns4:Type>
      <ns4:Record>S</ns4:Record>
      <ns4:AnotherCode>D</ns4:AnotherCode>
    </ns5:ListRequest>
  </soapenv:Body>
</soapenv:Envelope> (jaxws.LoggingJaxWsHandler) [WContainer : 0] [XXXXX:11aa11a-123-12a4-12a3-12323aabb123BB:4] 2021-02-05 01:00:00,000: [DEBUG] Somesystem::Request:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
  <soapenv:Header>
    <ctx:App xmlns:ctx="http://namespace">
      <ctx:Session>
        <ctx:UN>XXXXX</ctx:UN>
        <ctx:SId>11aa11a-123-12a4-12a3-12323aabb123BB</ctx:SId>
        <ctx:Creation>2021-02-05T01:00:00+11:00</ctx:Creation>
      </ctx:Session>
      <ctx:IC>
        <ctx:TId>1as23bb3-1er2-234d-234e-bb8b20995147</ctx:TId>
        <ctx:Call>
          <ctx:BI>25</ctx:BI>
          <ctx:CN>Somesystem</ctx:CN>
        </ctx:Call>
        <ctx:Call>
          <ctx:BI>1</ctx:BranchIndex>
        </ctx:Call>
        <ctx:Call>
          <ctx:BI>1</ctx:BI>
        </ctx:Call>
        <ctx:Call>
          <ctx:BI>1</ctx:BI>
        </ctx:Call>
        <ctx:Call>
          <ctx:BI>1</ctx:BI>
          <ctx:CN>Somesystem</ctx:CN>
          <ctx:CL>UnknownLocation</ctx:CL>
        </ctx:Call>
        <ctx:Call>
          <ctx:BI>0</ctx:BI>
        </ctx:Call>
      </ctx:IC>
    </ctx:App>
    <wsse:Security xmlns:wsse="http://xt-1.0.xsd">
      <wsse:UT>
        <wsse:UN>SomeUSR</wsse:UN>
      </wsse:UT>
    </wsse:Security>
  </soapenv:Header>
  <soapenv:Body>
    <s:ListResponse xmlns:s="http://Namespace/Service/V1.0" xmlns:t="http://Namespace/Core/V1.0" xmlns:m="http://Namespace/Core/Messaging/V1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://Namespace/Service/V1.0 ..\Service\V1.0\Response.xsd">
      <s:List>
        <s:FL>
          <t:lDate>2021-01-05</t:lDate>
          <t:Code>N</t:Code>
          <t:lID>AB123</t:lID>
        </s:FL>
        <s:FL>
          <t:lDate>2021-01-05</t:lDate>
          <t:Code>G</t:Code>
          <t:lID>CD456</t:lID>
        </s:FL>
        <s:FL>
          <t:Date>2021-01-05</t:Date>
          <t:Code>W</t:Code>
          <t:lID>EF654</t:lID>
        </s:FL>
        <s:FL>
          <t:Date>2021-01-05</t:Date>
          <t:Code>P</t:Code>
          <t:lID>TR123</t:lID>
        </s:FL>
        <s:FL>
          <t:lDate>2021-01-05</t:lDate>
          <t:Code>N</t:Code>
          <t:lID>AB123</t:lID>
        </s:FL>
        <s:FL>
          <t:lDate>2021-01-05</t:lDate>
          <t:Code>N</t:Code>
          <t:lID>AB123</t:lID>
        </s:FL>
        <s:FL>
          <t:Date>2021-01-05</t:Date>
          <t:Code>M</t:Code>
          <t:lID>AB345</t:lID>
        </s:FL>
        <s:FL>
          <t:Date>2021-01-05</t:Date>
          <t:Code>C</t:Code>
          <t:lID>AB456</t:lID>
        </s:FL>
      </s:List>
    </s:ListResponse>
  </soapenv:Body>
</soapenv:Envelope> (jaxws.LoggingJaxWsHandler) [WContainer : 3]

我希望能够以易于导入到 Teradata 中的格式提取数据

UN, SId, Creation, TId, BI, CN, FromDate, ToDate, Code, Type, Record, AnotherCode, FL, Ldate, Iid,......等等

我愿意接受任何关于有更好的方法来获得这个肥皂树的平面结构的建议。如您所见,第二个 SoapEnvelope 在 soapBody 中的数据比第一个多得多。我找不到任何与此类似的问题。

注意:我无法访问命令行

正如 Olaf 所说,可能很难将 xml 转换为平面 csv 记录。 xml 通常由许多 parent/child 对象组成,而 csv 通常是每行单个对象

为了帮助或指导您的进步,您可以尝试使用 xml 信封之一,并通过执行以下操作将其转换为 powershell 中的 xml 对象。

$xml = [xml]@"
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
  <soapenv:Header>
    <ctx:App xmlns:ctx="http://namespace">
      <ctx:Session>
        <ctx:UN>XXXXX</ctx:UN>
        <ctx:SId>11aa11a-123-12a4-12a3-12323aabb123</ctx:SId>
        <ctx:Creation>2021-02-05T00:00:00+11:00</ctx:Creation>
      </ctx:Session>
      <ctx:IC>
        <ctx:TId>11aa1aa-1aa1-2a22-3aa1-aa1b1233456</ctx:TId>
        <ctx:Call>
          <ctx:BI>13</ctx:BI>
          <ctx:CN>Somesystem</ctx:CN>
        </ctx:Call>
        <ctx:Call>
          <ctx:BI>1</ctx:BI>
        </ctx:Call>
        <ctx:Call>
          <ctx:BI>1</ctx:BI>
        </ctx:Call>
        <ctx:Call>
          <ctx:BI>1</ctx:BI>
        </ctx:Call>
        <ctx:Call>
          <ctx:BI>1</ctx:BI>
          <ctx:CN>Somesystem</ctx:CN>
          <ctx:CL>UnknownLocation</ctx:CL>
        </ctx:Call>
        <ctx:Call>
          <ctx:BI>0</ctx:BI>
        </ctx:Call>
      </ctx:IC>
    </ctx:App>
    <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
      <wsse:UT>
        <wsse:UN>SomesystemUSR</wsse:UN>
        <wsse:P>Somepassword</wsse:P>
      </wsse:UT>
    </wsse:Security>
  </soapenv:Header>
  <soapenv:Body>
    <ns5:ListRequest xmlns:ns5="http://Namespace/Service/V1.0" xmlns="http://www.immi.gov.au/Namespace/Enterprise/ErrorMessages/V1.0" xmlns:ns6="http://Namespace/Core/V1.0" xmlns:ns8="http://Namespace/Service/V1.0" xmlns:ns7="http://Namespace/Core/V1.0" xmlns:ns9="http://Namespace/Core/V1.0"
      xmlns:ns10="http://Namespace/Core/Messaging/V1.0" xmlns:ns2="http://Namespace/Enterprise/V1.0" xmlns:ns4="http://Namespace/Core/V1.0" xmlns:ns3="http://Namespace/WarningMessages/V1.0">
      <ns4:FromDate>2021-01-28</ns4:FromDate>
      <ns4:ToDate>2021-01-28</ns4:ToDate>
      <ns4:Code>0123</ns4:Code>
      <ns4:Type>U</ns4:Type>
      <ns4:Record>S</ns4:Record>
      <ns4:AnotherCode>D</ns4:AnotherCode>
    </ns5:ListRequest>
  </soapenv:Body>
</soapenv:Envelope>
"@

从那里您可以通过向下钻取属性来检查对象的外观

    PS Env:\> $xml

Envelope
--------
Envelope

PS Env:\> $xml.Envelope

soapenv                                   Header Body
-------                                   ------ ----
http://schemas.xmlsoap.org/soap/envelope/ Header Body

PS Env:\> $xml.Envelope.Body

ListRequest
-----------
ListRequest

PS Env:\> $xml.Envelope.Body.ListRequest

ns5         : http://Namespace/Service/V1.0
xmlns       : http://www.immi.gov.au/Namespace/Enterprise/ErrorMessages/V1.0
ns6         : http://Namespace/Core/V1.0
ns8         : http://Namespace/Service/V1.0
ns7         : http://Namespace/Core/V1.0
ns9         : http://Namespace/Core/V1.0
ns10        : http://Namespace/Core/Messaging/V1.0
ns2         : http://Namespace/Enterprise/V1.0
ns4         : http://Namespace/Core/V1.0
ns3         : http://Namespace/WarningMessages/V1.0
FromDate    : 2021-01-28
ToDate      : 2021-01-28
Code        : 0123
Type        : U
Record      : S
AnotherCode : D

这就是我的全部。除了从 xml 对象中挑选出你想要的内容并创建具有这些属性的自定义对象之外,我不知道有什么方法可以将这种类型的多维对象转换为平面 csv。我敢肯定有更聪明的人可以提供更多:)

更新: 因此,为了将这个想法更进一步并解释我创建自定义对象的意思,我创建了这个函数,它将接收 xml 对象并将其转换为具有我从中挑选出的属性的自定义对象xml。之后,您可以使用 ConvertTo-CsvExport-Csv cmdlet 生成 csv/csv 文件

function Convert-SoapXmlToCustomObject
{
    [cmdletbinding()]
    param(
        [Parameter(ValueFromPipeline = $true, Mandatory = $true)]
        [xml[]]$XmlObject
    )

    Process
    {
        if ($XmlObject)
        {
            foreach ($xml in $XmlObject)
            {
                [pscustomobject][ordered]@{
                    Sid         = $xml.Envelope.Header.App.Session.SId
                    Creation    = $xml.Envelope.Header.App.Session.Creation
                    Tid         = $xml.Envelope.Header.App.IC.TId
                    Calls       = @() #if each call needs to be separate record maybe use loop to create
                    Username    = $xml.Envelope.Header.Security.ut.UN
                    FromDate    = $xml.Envelope.Body.ListRequest.FromDate
                    ToDate      = $xml.Envelope.Body.ListRequest.ToDate
                    Code        = $xml.Envelope.Body.ListRequest.Code
                    Type        = $xml.Envelope.Body.ListRequest.Type
                    Record      = $xml.Envelope.Body.ListRequest.Record
                    AnotherCode = $xml.Envelope.Body.ListRequest.AnotherCode

                }
            }
        }
    }
}

$xml, $xml2 | Convert-SoapXmlToCustomObject | ConvertTo-Csv -NoTypeInformation

输出看起来像这样

"Sid","Creation","Tid","Calls","Username","FromDate","ToDate","Code","Type","Record","AnotherCode"
"11aa11a-123-12a4-12a3-12323aabb123","2021-02-05T00:00:00+11:00","11aa1aa-1aa1-2a22-3aa1-aa1b1233456","System.Object[]","SomesystemUSR","2021-01-28","2021-01-28","0123","U","S","D"
"11aa11a-123-12a4-12a3-12323aabb123BB","2021-02-05T01:00:00+11:00","1as23bb3-1er2-234d-234e-bb8b20995147","System.Object[]","SomeUSR",,,,,,