2017-02-03 9 views
1

Я использую веб-сервис для генерации некоторого XML и передачи на DataSet.
Ниже код для чтения XML в DataSet:Прочитать XML в DataSet быстрее, чем с XmlReader в .net framework 2.0, window CE 6.5

byte[] buffer = Encoding.UTF8.GetBytes(xmlData); 
using (System.IO.MemoryStream stream = new System.IO.MemoryStream(buffer)) 
{ 
    System.Xml.XmlReader reader = System.Xml.XmlReader.Create(stream); 
    ds.ReadXml(reader); 
} 

Xml файл, как показано ниже, получить от SOAP:

<NewDataSet> 
    <Table> 
    <ID>1002065</ID> 
    <Item_No>0000043</Item_No> 
    <Description>Test2</Description> 
    <Remarks /> 
    <Ref_No /> 
    </Table> 
    <Table> 
    <ID>1002034</ID> 
    <Item_No>0000054</Item_No> 
    <Description>Test2</Description> 
    <Remarks /> 
    <Ref_No /> 
    </Table> 
</NewDataSet> 

я узнал, что ds.ReadXml занимает 42 секунд, чтобы загрузить 1700 записей очень медленно , Использование рамки 2.0 Любые предложения по увеличению скорости?

Теперь измените

XmlDocument doc = new XmlDocument(); 
doc.LoadXml(xmlData); 
XmlNode nodes = doc.DocumentElement; 

string ID = "", Item_No= "", Description = "", Remarks = "", Ref_No= ""; 

DataTable dt = new DataTable(); 
dt.Clear(); 
dt.Columns.Add("ID"); 
dt.Columns.Add("Item_No"); 
dt.Columns.Add("Description"); 
dt.Columns.Add("Remarks"); 
dt.Columns.Add("Ref_No"); 

foreach (XmlNode node in nodes) 
{ 
    ID = node.SelectSingleNode("ID").InnerText; 
    Item_No = node.SelectSingleNode("Item_No").InnerText; 
    Description = node.SelectSingleNode("Description").InnerText; 
    Remarks = node.SelectSingleNode("Remarks").InnerText; 
    Ref_No = node.SelectSingleNode("Ref_No").InnerText; 

    dt.Rows.Add(ID, Item_No, Description, Remarks , Ref_No) 
} 
    dataSet ds= new dataSet(); 
    ds.Tables.Add(dt); 

Но скорость загрузки до сих пор же 1700 записей в 40 секунд.

+0

как о 'XDocument XML = XDocument.Load (поток);' –

+0

, что ссылка на XDocument? – user14351

+1

Как в стороне, вы можете использовать 'StringReader' вместо того, чтобы получать все строковые байты и создавать поток памяти над ними. 'XmlReader.Create' имеет перегрузку, которая принимает' TextReader'. –

ответ

1

Основываясь на вашем примере кода, я думаю, что вы делаете вещи более сложными, чем вам нужно. Я предлагаю вам пропустить буферную часть. Вместо того, чтобы написать

XmlDocument doc = new XmlDocument(); 
XmlNodeList element; 
doc.load(file.xml); 
//do stuff... 

или

XmlReader xReader = XmlReader.Create(new StringReader(xmlNode)); 
while (xReader.Read()) 
{ 
switch (xReader.NodeType) 
{ 
    case XmlNodeType.Element: 
    //Do stuff... 
    break; 
    case XmlNodeType.Text: 
    //Do some stuff... 
    break; 
    case XmlNodeType.EndElement: 
    //Do some other stuff... 
    break; 
} 
} 
+0

Мы используем 'XmlNode nodes = doc.DocumentElement;', а затем 'foreach (узел XmlNode в узлах.ChildNodes)' (верхний пример), и он работает хорошо. Использование .NET v2.0 Compact Framework для Windows CE 5.0 и 6.0. – AlainD

+0

@AlainD Я изменил свой код, чтобы читать xmlnode в наборе данных, но я все еще сталкиваюсь с той же проблемой. Любые другие способы ускорить чтение? Благодарю. – user14351

+0

Можете ли вы обновить вопрос с помощью версии .NET CF и Windows CE (5.0, 6.0, 7.0), которые вы используете? – AlainD

1

код Try ниже. Его можно сделать динамическим, если каждая таблица имеет разные столбцы. Не уверен, что ваш XML-адрес действительно представляет собой xml.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Xml.Linq; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     const string FILENAME = @"c:\temp\test.xml"; 
     static void Main(string[] args) 
     { 
      XmlReader reader = XmlReader.Create(FILENAME); 

      while (!reader.EOF) 
      { 
       if (reader.Name != "Table") 
       { 
        reader.ReadToFollowing("Table"); 
       } 
       if (!reader.EOF) 
       { 
        XElement table = (XElement)XElement.ReadFrom(reader); 
        Table newTable = new Table() { 
         id = (int)table.Element("ID"), 
         no = (string)table.Element("Item_No"), 
         description = (string)table.Element("Description"), 
         remarks = (string)table.Element("Remarks"), 
         refNo = (string)table.Element("Ref_No") 
        }; 
        Table.table.Add(newTable); 
       } 
      } 

     } 
    } 
    public class Table 
    { 
     public static List<Table> table = new List<Table>(); 

     public int id { get; set; } 
     public string no { get; set; } 
     public string description { get; set; } 
     public string remarks { get; set; } 
     public string refNo { get; set; } 
    } 
} 
    //<ID>1002065</ID> 
    //<Item_No>0000043</Item_No> 
    //<Description>Test2</Description> 
    //<Remarks /> 
    //<Ref_No /> 
+0

не может найти ссылку для XElement, используя окно ce .. – user14351

+0

Нужна библиотека System.Xml.Linq – jdweng

+0

@jdweng: 'Linq' добавлен только из .NET Compact Framework v3.5 (и недоступен в версии 2.0) , OP должен указать, какая версия .NET является целевой. – AlainD