Tshumore Ответов: 1

Как устранить неверную синтаксическую ошибку при синтаксическом анализе XML-документа


У меня есть программа для импорта данных из XML-файла в таблицу SQL Server. Когда я отлаживаю программу, я получаю ошибку "неправильный синтаксис рядом с" транзакцией"", когда поток начинает создавать таблицу . Мой XML структурирован следующим образом :
<?xml version="1.0" encoding="utf-16"?>
<EXPORT_HEADER xmlns="http://www.sir.com/SFI/Export/GL_Export/20051005" 

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 

xsi:schemaLocation="http://www.sir.com/SFI/Export/GL_Export/20051005  
GL_EXPORT.xsd" total_transactions="4616" total_accnts="2000">
 <TRANSACTION business_type_code="DIRECT" term="NB" />
  <TRANSACTION business_type_code="DIRECT" term="NB" />
  </EXPORT_HEADER>


Однако когда я использую раздел тега транзакции который содержит фактические данные которые я хочу зафиксировать я получаю синтаксическую ошибку выше
DataSet DS = new DataSet();
           DS.ReadXml(XMlFile);

           DataTable dt = DS.Tables[1];

           if (dt.Columns.Count == 0)
               dt.ReadXmlSchema(XMlFile);
               dt.ReadXml(XMlFile);


Это мой код для импорта XML - файла в таблицу Sql server :
private void btnImport_Click(object sender, EventArgs e)
    {
        const string XMlFile = @"C:\Users\tshumae\Documents\MyProjects\MyProject\GL_Export_54_201907081053.xml";
       // string XMlFile = txtFilePath.Text;
        if (File.Exists(XMlFile))
        {
            // Conversion Xml file to DataTable
            DataSet DS = new DataSet();
            DS.ReadXml(XMlFile);

            DataTable dt = DS.Tables[0];

            if (dt.Columns.Count == 0)
                dt.ReadXmlSchema(XMlFile);
                dt.ReadXml(XMlFile);


            // Creating Query for Table Creation
            string Query = CreateTableQuery(dt);
            SqlConnection con = new SqlConnection(StrCon);
            con.Open();

            // Deletion of Table if already Exist
            SqlCommand cmd = new SqlCommand("IF OBJECT_ID('dbo." + dt.TableName + "', 'U') IS NOT NULL DROP TABLE dbo." + dt.TableName + ";", con);
            cmd.ExecuteNonQuery();

            // Table Creation
            cmd = new SqlCommand(Query, con);
            int check = cmd.ExecuteNonQuery();
            if (check != 0)
            {
            // Copy Data from DataTable to Sql Table
            using (var bulkCopy = new SqlBulkCopy(con.ConnectionString, SqlBulkCopyOptions.KeepIdentity))
            {

                foreach (DataColumn col in dt.Columns)
                {
                    bulkCopy.ColumnMappings.Add(col.ColumnName, col.ColumnName);
                }

                bulkCopy.BulkCopyTimeout = 600;
                bulkCopy.DestinationTableName = dt.TableName;
                bulkCopy.WriteToServer(dt);
            }

                MessageBox.Show("Table Created Successfully");
            }
            con.Close();
        }

    }


Что я уже пробовал:

В качестве проверки я попробовал использовать раздел EXPORT_HEADER, и данные в заголовке успешно зафиксированы, а таблица также создана:
DataSet DS = new DataSet();
            DS.ReadXml(XMlFile);

            DataTable dt = DS.Tables[0];

            if (dt.Columns.Count == 0)
                dt.ReadXmlSchema(XMlFile);
                dt.ReadXml(XMlFile);<pre lang="c#">

Afzaal Ahmad Zeeshan

Исправляя синтаксис, я полагаю. :-)

И мальчик, ты подвергаешь свою систему тяжелой SQL-инъекции, причем не из одного, а из двух регионов! :Д

Maciej Los

Ух ты! Это выглядит очень подозрительно:

SqlCommand cmd = new SqlCommand("IF OBJECT_ID('dbo." + dt.TableName + "', 'U') IS NOT NULL DROP TABLE dbo." + dt.TableName + ";", con);

и это может быть очень опасно.

1 Ответов

Рейтинг:
1

Gerry Schmitz

Десериализуйте в класс. Тебе повезет больше.

XmlSerializer.Метод Десериализации (System.Xml.Serialization) | Microsoft Docs[^]

// NOTE: Generated code may require at least .NET Framework 4.5 or .NET Core/Standard 2.0.
      /// <remarks/>
      [System.SerializableAttribute()]
      [System.ComponentModel.DesignerCategoryAttribute( "code" )]
      [System.Xml.Serialization.XmlTypeAttribute( AnonymousType = true, Namespace = "http://www.sir.com/SFI/Export/GL_Export/20051005" )]
      [System.Xml.Serialization.XmlRootAttribute( Namespace = "http://www.sir.com/SFI/Export/GL_Export/20051005", IsNullable = false )]
      public partial class EXPORT_HEADER {

         private EXPORT_HEADERTRANSACTION[] tRANSACTIONField;

         private ushort total_transactionsField;

         private ushort total_accntsField;

         /// <remarks/>
         [System.Xml.Serialization.XmlElementAttribute( "TRANSACTION" )]
         public EXPORT_HEADERTRANSACTION[] TRANSACTION {
            get {
               return this.tRANSACTIONField;
            }
            set {
               this.tRANSACTIONField = value;
            }
         }

         /// <remarks/>
         [System.Xml.Serialization.XmlAttributeAttribute()]
         public ushort total_transactions {
            get {
               return this.total_transactionsField;
            }
            set {
               this.total_transactionsField = value;
            }
         }

         /// <remarks/>
         [System.Xml.Serialization.XmlAttributeAttribute()]
         public ushort total_accnts {
            get {
               return this.total_accntsField;
            }
            set {
               this.total_accntsField = value;
            }
         }
      }

      /// <remarks/>
      [System.SerializableAttribute()]
      [System.ComponentModel.DesignerCategoryAttribute( "code" )]
      [System.Xml.Serialization.XmlTypeAttribute( AnonymousType = true, Namespace = "http://www.sir.com/SFI/Export/GL_Export/20051005" )]
      public partial class EXPORT_HEADERTRANSACTION {

         private string business_type_codeField;

         private string termField;

         /// <remarks/>
         [System.Xml.Serialization.XmlAttributeAttribute()]
         public string business_type_code {
            get {
               return this.business_type_codeField;
            }
            set {
               this.business_type_codeField = value;
            }
         }

         /// <remarks/>
         [System.Xml.Serialization.XmlAttributeAttribute()]
         public string term {
            get {
               return this.termField;
            }
            set {
               this.termField = value;
            }
         }
      }


Tshumore

Будет ли это случай чтения XML-данных через класс тогда , если да, то как. я не совсем уверен, как включить десериализованный объект в мою реализацию.