Need advice of best way to read XML files into DB

Hello,
The following process needs to be “automated” and it was submitted as this:

We send our accounts payable bills to an external company which will produce XML files with them and send us back the XML by e-mail.

I was asked to create a XML reader app to save the XML into a DB table. Then from the table they will generate the Excel file to use in a DMT import into Epicor.

My first thought was hey I can create the excel file directly, no need to use the DB table.

Then I tought… isn’t REST could be used and so write automatically into Epicor without using DMT ? (did not yet touched REST yet… )

Anyone has done so before?

Thanks for your inputs…

Pierre

1 Like

Depends on where you are inserting these records. If you are doing in the a UD table you should have no issues. Most REST services are calling METHODS where the DMT does not. Have you tried opening the XML in Excel. Excel will parse out the XML though its not always correct.

The issue I have is being able to interpret the XML file to start with. How to read the different nodes … I know that each file is one invoice. But each invoices can have multiple lines. Here is a sample of the file: Right now, all I read is the InvoiceHeader info…via

DataSet dsXMLReader = new DataSet();
dsXMLReader.ReadXml(file.FullName);

I need to differentiate the header info vs the multiple line info. in order to save the header in a one temp table, and lines in another temp table.

(for now I just want to show them in two datagrids…)

How could I acheive that?

sample xml
<INVOICE>
  <INVOICEHEADER>
    <INVOICEID>139774</INVOICEID>
    <INVOICECATEGORYCODE>NONPO</INVOICECATEGORYCODE>
    <INVOICETYPECODE>I</INVOICETYPECODE>
    <INVOICETYPEID>1</INVOICETYPEID>
    <SUPPLIERID>WIN001</SUPPLIERID>
    <SUPPLIERNAME>WINSTON &amp; STRAWN LLP</SUPPLIERNAME>
    <INVOICENO>2734171</INVOICENO>
    <INVOICEDATE>2020-04-07</INVOICEDATE>
    <DUEDATE></DUEDATE>
    <PAYMENTTERMCODE></PAYMENTTERMCODE>
    <INVOICENETAMOUNT>1688.31</INVOICENETAMOUNT>
    <INVOICETAXAMOUNT></INVOICETAXAMOUNT>
    <INVOICETOTAMOUNT>1688.31</INVOICETOTAMOUNT>
    <INVOICECURRENCY>CAD</INVOICECURRENCY>
    <TAXCODE></TAXCODE>
    <TAXTRANSFTYPE></TAXTRANSFTYPE>
    <TAXTRANSFCODE></TAXTRANSFCODE>
    <TAXTRANSFAMOUNT></TAXTRANSFAMOUNT>
    <TAXTRANSFTAXAMOUNT></TAXTRANSFTAXAMOUNT>
    <DEDUCTIBLETAXPERC></DEDUCTIBLETAXPERC>
    <COSTAMOUNT1></COSTAMOUNT1>
    <COSTAMOUNT2></COSTAMOUNT2>
    <DISCOUNTAMOUNT></DISCOUNTAMOUNT>
    <GACCOUNT></GACCOUNT>
    <GACCOUNTAMOUNT></GACCOUNTAMOUNT>
    <PROJECTNO></PROJECTNO>
    <INVESTNO></INVESTNO>
    <CONTRACTNO></CONTRACTNO>
    <ORDERNOS></ORDERNOS>
    <ERRORFLAG>False</ERRORFLAG>
    <EXTERNALERRORTEXT></EXTERNALERRORTEXT>
    <BOOKYEAR></BOOKYEAR>
    <BOOKPERIOD></BOOKPERIOD>
    <STRUCTUREDCOMMUNICATION></STRUCTUREDCOMMUNICATION>
    <DESCRIPTION></DESCRIPTION>
    <JOURNALCODE></JOURNALCODE>
    <JOURNALNO></JOURNALNO>
    <TOCHARGEOUTFLAG>Y</TOCHARGEOUTFLAG>
    <APPROVECODEID>140305</APPROVECODEID>
    <BLOCKREASONCODE>CN</BLOCKREASONCODE>
    <BLOCKAMOUNT></BLOCKAMOUNT>
    <INVOICECOUNTERPARTAMOUNT></INVOICECOUNTERPARTAMOUNT>
    
    <INVOICERELEASEAMOUNT>1688.31</INVOICERELEASEAMOUNT>
    <INVOICETOTRELEASEDAMOUNT>1688.31</INVOICETOTRELEASEDAMOUNT>
    <INVOICELASTRELEASEDAMOUNT>1688.31</INVOICELASTRELEASEDAMOUNT>
    <PO></PO>
    <STATUS>ARCHIVED</STATUS>
    <CASEID>139772</CASEID>
    <VALID>0</VALID>
    <FUNCSTEPID>6</FUNCSTEPID>
    <ACTION>1</ACTION>
    <APPROVEFLAG>1</APPROVEFLAG>
    <BATCHID>139611</BATCHID>
    <SCANSTATIONID></SCANSTATIONID>
    <SCANNO>0</SCANNO>
    <SCANDATE>2020-04-17</SCANDATE>
    <BARCODE></BARCODE>
    
    <APPROVERS>
      <APPROVER APPROVERID="140329">
        <APPROVERLEVEL>1</APPROVERLEVEL>
        <APPROVEDBY>_DATABASE\SPAPP1</APPROVEDBY>
      </APPROVER>
    </APPROVERS>
  </INVOICEHEADER>
  <BOOKLINES>
    <BOOKLINE>
      <BOOKLINEID>140064</BOOKLINEID>
      <GENERALLEDGERCODE>10143</GENERALLEDGERCODE>      
      <TAXCODE></TAXCODE>
      <TAXAMOUNT></TAXAMOUNT>
      <NETAMOUNT>1688.31</NETAMOUNT>
      <DEFBOOKDISTRCODE></DEFBOOKDISTRCODE>
      <DEFBOOKYEARFROM></DEFBOOKYEARFROM>
      <DEFBOOKPERIODFROM></DEFBOOKPERIODFROM>
      <DEFBOOKPERIODQUANTITY></DEFBOOKPERIODQUANTITY>
      <TEXT></TEXT>
      <VALID>0</VALID>
      <APPROVEFLAG>0</APPROVEFLAG>
      <INVOICECOUNTERPARTAMOUNT></INVOICECOUNTERPARTAMOUNT>      
    </BOOKLINE>
	<BOOKLINE>
      <BOOKLINEID>123456</BOOKLINEID>
      <GENERALLEDGERCODE>20245</GENERALLEDGERCODE>
      
      <TAXCODE></TAXCODE>
      <TAXAMOUNT></TAXAMOUNT>
      <NETAMOUNT>999.99</NETAMOUNT>
      <DEFBOOKDISTRCODE></DEFBOOKDISTRCODE>
      <DEFBOOKYEARFROM></DEFBOOKYEARFROM>
      <DEFBOOKPERIODFROM></DEFBOOKPERIODFROM>
      <DEFBOOKPERIODQUANTITY></DEFBOOKPERIODQUANTITY>
      <TEXT></TEXT>
      <VALID>0</VALID>
      <APPROVEFLAG>0</APPROVEFLAG>
      
    </BOOKLINE>
  </BOOKLINES>
</INVOICE>

Thank you.

@Hogardy all I know about XML I have learned in the last 48 hours, so there are likely better ways to get there, but I am doing something like that with code like this that I cobbled together from samples.

  XmlDocument doc = new XmlDocument();
  using (StreamReader streamReader = new StreamReader(file.Directory +"\\" + file.Name, Encoding.UTF8))
  {
    contents = streamReader.ReadToEnd();
  }
  doc.LoadXml(contents);


  XmlNodeList nodeList;
  nodeList=doc.SelectNodes("//INVOICE/INVOICEHEADER");

  foreach (XmlNode node in nodeList)
  {
    invoiceID= node.SelectSingleNode( "INVOICEID").InnerText;
	...
    
  }

  nodeList=doc.SelectNodes("//INVOICE/BOOKLINES/BOOKLINE");

  foreach (XmlNode node in nodeList)
  {
    booklineID= node.SelectSingleNode( "BOOKLINEID").InnerText;
	...
    
  }

1 Like

Thanks!

I was just looking at such example… parsing it “manually” cause using serialization was not working so far…

Will let you know!

OK I ended up using this solution and worked well.

Thanks Greg.