Powershell - экспорт XML без закрывающих тегов - формат OFX SGML? - PullRequest
0 голосов
/ 18 апреля 2020

Я пытаюсь создать файл OFX для импорта в Sage300 с помощью powershell. Это должно обеспечить автоматическую банковскую сверку. Не слишком знаком со структурой OFX, но, похоже, это SGML v1.02. Ввод будет из запроса SQL. Структура целевого OFX выглядит следующим образом:

OFXHEADER:100
DATA:OFXSGML
VERSION:102
SECURITY:NONE
ENCODING:USASCII
CHARSET:1252
COMPRESSION:NONE
OLDFILEUID:
NEWFILEUID:

<OFX>
  <SIGNONMSGSRSV1>
    <SONRS>
      <STATUS>
        <CODE>0
        <SEVERITY>INFO
        <MESSAGE>OK
      </STATUS>
      <DTSERVER>2007126895412
      <USERKEY>20075698742365
      <LANGUAGE>ENG
      <INTU.BID>00004
    </SONRS>
  </SIGNONMSGSRSV1>
  <CREDITCARDMSGSRSV1>
    <CCSTMTTRNRS>
      <TRNUID>12345678
      <STATUS>
        <CODE>0
        <SEVERITY>INFO
        <MESSAGE>OK
      </STATUS>
      <CCSTMTRS>
        <CURDEF>GBP
        <CCACCTFROM>
           <ACCTID>12345678
        </CCACCTFROM>
        <BANKTRANLIST>
          <DTSTART>20191201
          <DTEND>20201231
          <STMTTRN>
            <TRNTYPE>CREDIT
            <DTPOSTED>20200408
            <TRNAMT>11.98
            <REFNUM>000173160-0000810
            <FITID>000173160-0000810
            <NAME>FBAAMZUK
            <MEMO>CHK
            <CHECKNUM>000173160-0000810
          </STMTTRN>
          <STMTTRN>
            <TRNTYPE>CREDIT
            <DTPOSTED>20200408
            <TRNAMT>6.99
            <REFNUM>000173160-0000968
            <FITID>000173160-0000968
            <NAME>FBAAMZUK
            <MEMO>CHK
            <CHECKNUM>000173160-0000968
          </STMTTRN>
          <STMTTRN>
            <TRNTYPE>CREDIT
            <DTPOSTED>20200408
            <TRNAMT>50.00
            <REFNUM>0123-0123
            <FITID>0123-0123
            <NAME>FBAAMZUK
            <MEMO>TEST
          </STMTTRN>
        </BANKTRANLIST>
        <LEDGERBAL>
          <xBALAMT>0.00
          <BALAMT>18.97
          <DTASOF>20200414
        </LEDGERBAL>
        <AVAILBAL>
          <xBALAMT>0.00
          <BALAMT>-4323.81
          <DTASOF>20200414
        </AVAILBAL>
      </CCSTMTRS>
    </CCSTMTTRNRS>
  </CREDITCARDMSGSRSV1>
</OFX>

Как вы можете видеть, некоторые элементы имеют закрывающие теги, а некоторые - нет. Приведенный выше формат был протестирован при импорте и работает.
До сих пор я использовал XmlTextWriter для генерации правильно отформатированного XML do c.
Этот код работает нормально. Однако, поскольку он правильно отформатирован, он закрывает каждый элемент.
Есть ли способ экспортировать это без закрытия тегов? Или мне нужно будет повторно импортировать XML и выполнить замену строки? Любой совет с благодарностью.

    $Path = "C:\scripts\TEST.xml"

#SQL Connection
$sqlConn = New-Object System.Data.SqlClient.SqlConnection
$sqlConn.ConnectionString = “Server=xxxxxx;Integrated Security=true;Initial Catalog=master”
$sqlConn.Open()

#SQL Command
$sqlcmd = $sqlConn.CreateCommand()
$sqlcmd = New-Object System.Data.SqlClient.SqlCommand
$sqlcmd.Connection = $sqlConn

#SQL query
$query = “SELECT 
payments.[order-id],
payments.[settlement-id],
replace(convert (date, payments.[posted-date],103),'-','') AS [posted-date],
payments.[transaction-type],
payments.[marketplace-name],

SUM (CAST(payments.amount AS money)) AS amount

FROM xxxxxx.dbo.PAYMENTS
where [amount-type] <> 'ItemFees' AND ([transaction-type] = 'Order' OR [transaction-type] = 'Refund')

GROUP BY [order-id], [settlement-id],[posted-date],[transaction-type],[marketplace-name]”

$sqlcmd.CommandText = $query

#SQL adapter
$adp = New-Object System.Data.SqlClient.SqlDataAdapter $sqlcmd

#Get data and fill data set
$data = New-Object System.Data.DataSet
$adp.Fill($data) | Out-Null
$dataSet = $data.Tables[0]
$sqlConn.Close()

# get an XMLTextWriter to create the XML
$XmlWriter = New-Object System.XMl.XmlTextWriter($Path,$Null)

# XML formatting
$xmlWriter.Formatting = 'Indented'
$xmlWriter.Indentation = 1
$XmlWriter.IndentChar = "`t"

# write the header
$xmlWriter.WriteStartDocument()

# set XSL statements
$xmlWriter.WriteProcessingInstruction("xml-stylesheet", "type='text/xsl' href='style.xsl'")

# create root element "OFX" and add some attributes to it

$xmlWriter.WriteStartElement('OFX')

$xmlWriter.WriteStartElement('SIGNONMSGSRSV1')

$xmlWriter.WriteStartElement('SONRS')

$xmlWriter.WriteStartElement('STATUS')
$XmlWriter.WriteElementString('CODE', '0')
$XmlWriter.WriteElementString('SEVERITY', 'INFO')
$XmlWriter.WriteElementString('MESSAGE', 'OK')
$xmlWriter.WriteEndElement()

$XmlWriter.WriteElementString('DTSERVER', '2007126895412')
$XmlWriter.WriteElementString('USERKEY', '20075698742365')
$XmlWriter.WriteElementString('LANGUAGE', 'ENG')
$XmlWriter.WriteElementString('INTU.BID', '00004')

$xmlWriter.WriteEndElement()

$xmlWriter.WriteEndElement()

$xmlWriter.WriteStartElement('CREDITCARDMSGSRSV1')

$xmlWriter.WriteStartElement('CCSTMTTRNRS')
$XmlWriter.WriteElementString('TRNUID', '12345678')

$xmlWriter.WriteStartElement('STATUS')
$XmlWriter.WriteElementString('CODE', '0')
$XmlWriter.WriteElementString('SEVERITY', 'INFO')
$XmlWriter.WriteElementString('MESSAGE', 'OK')
$xmlWriter.WriteEndElement()

$xmlWriter.WriteStartElement('CCSTMTRS')
$XmlWriter.WriteElementString('CURDEF', 'GBP')

$xmlWriter.WriteStartElement('CCACCTFROM')
$XmlWriter.WriteElementString('ACCTID', '12345678')
$xmlWriter.WriteEndElement()

$xmlWriter.WriteStartElement('BANKTRANLIST')
$XmlWriter.WriteElementString('DTSTART', '20191201')
$XmlWriter.WriteElementString('DTEND', '20201231')

foreach ($row in $dataSet)
{ 

$order_id = $row.'order-id'
$amt = $row.amount
$dateP = $row.'posted-date'

$xmlWriter.WriteStartElement('STMTTRN')
$XmlWriter.WriteElementString('TRNTYPE', 'CREDIT')
$XmlWriter.WriteElementString('DTPOSTED', $dateP)
$XmlWriter.WriteElementString('TRNAMT', $amt)
$XmlWriter.WriteElementString('REFNUM', $order_id)
$XmlWriter.WriteElementString('FITID', '000173160-0000810')
$XmlWriter.WriteElementString('NAME', 'FBAAMZUK')
$XmlWriter.WriteElementString('MEMO', 'CHK')
$XmlWriter.WriteElementString('CHECKNUM', '000173160-0000810')
$xmlWriter.WriteEndElement()
}

$xmlWriter.WriteEndElement()

$xmlWriter.WriteStartElement('LEDGERBAL')
$XmlWriter.WriteElementString('xBALAMT', '0.00')
$XmlWriter.WriteElementString('BALAMT', '18.97')
$XmlWriter.WriteElementString('DTASOF', '20200414')
$xmlWriter.WriteEndElement()

$xmlWriter.WriteStartElement('AVAILBAL')
$XmlWriter.WriteElementString('xBALAMT', '0.00')
$XmlWriter.WriteElementString('BALAMT', '-4323.81')
$XmlWriter.WriteElementString('DTASOF', '20200414')
$xmlWriter.WriteEndElement()


$xmlWriter.WriteEndElement()

$xmlWriter.WriteEndElement()

$xmlWriter.WriteEndElement()

$xmlWriter.WriteEndElement()

$xmlWriter.WriteEndDocument()
$xmlWriter.Flush()
$xmlWriter.Close()
...