2008-10-22 2 views
1

Вот сделка. У меня есть XML-документ с большим количеством записей. Что-то вроде этого:Проверка и извлечение записи XML по записи в базу данных

print("<?xml version="1.0" encoding="utf-8" ?> 
     <Orders> 
     <Order> 
     <Phone>1254</Phone> 
     <City>City1</City> 
     <State>State</State> 
     </Order> 
     <Order> 
     <Phone>98764321</Phone> 
     <City>City2</City> 
     <State>State2</State> 
     </Order> 
    </Orders>"); 

Существует также файл схемы XSD. Я хотел бы извлечь данные из этого файла и вставить эти записи в таблицу базы данных. Сначала, конечно, я хотел бы подтвердить каждую запись заказа. Например, если в файле 5 заказов и 2 из них не прошли проверку, я хотел бы вставить 3, которые прошли проверку в db, а остальные 2. В одном файле XML могут быть тысячи записей. Какой был бы лучший подход здесь. И как будет проходить проверка, поскольку мне нужно отбросить неудавшиеся записи и использовать только те, которые прошли проверку. На данный момент я использую XmlReaderSettings для проверки записей документов XML. Должен ли я извлекать эти записи в другой файл XML или набор данных или пользовательский объект перед вставкой в ​​БД. Я использую .Net 3.5. Любой код или ссылка приветствуется.

ответ

0

У вас есть несколько вариантов:

  1. XmlDataDocument или XmlDocument. Недостатком этого подхода является то, что данные будут кэшироваться в памяти, что плохо, если у вас их много. С другой стороны, вы получаете хорошие возможности для запросов в памяти с помощью DataSet. XmlDocument требует, чтобы вы использовали запросы XPath для работы с данными, тогда как XmlDataDocument предоставляет вам больше похожее на функциональность DataSet.

  2. XmlReader. Это хороший, быстрый подход, поскольку данные не кэшируются; вы читаете его понемногу, как поток. Вы переходите от одного элемента к другому и запрашиваете информацию об этом элементе в своем приложении, чтобы решить, что с ним делать. Это означает, что вы сохраняете в памяти вашего приложения уровень дерева, на котором вы находитесь, но с простой структурой XML-файлов, такой как ваш, это должно быть очень просто.

Я рекомендую вариант 2 в вашем случае. Он должен хорошо масштабироваться с точки зрения использования памяти и должен обеспечивать простейшую реализацию для обработки файла.

1

Если данные корректно сопоставляются с объектной моделью, вы можете попробовать использовать xsd.exe для генерации некоторых классов из .xsd и обработать классы в своем DAL по выбору. Проблема в том, что если громкость звука (вы упомянете тысячи записей), у вас, скорее всего, будет лот круглых поездок.

Другим вариантом может быть передача данных «как есть» в базу данных и использование SQL/XML для обработки данных в TSQL - предположительно, в качестве хранимой процедуры, которая принимает параметр типа xml (SQL Server 2005 и т. Д.), ,

+0

SQL-часть расширяема. – scarpacci 2011-10-29 14:22:41

0

Многое зависит от того, что означает «проверка» в вашем сценарии. Я предполагаю, что, поскольку вы используете .xsd, вы уже проверяете, что данные синтаксически правильны. Итак, подтверждение, вероятно, означает, что вы будете звонить другим службам или процедурам, чтобы определить, действителен ли заказ?

Возможно, вы захотите ознакомиться с сервисами интеграции серверов Sql. Задача XML в SSIS позволяет делать такие вещи, как запросы XPath, слияние, вероятно, что-то и все, что вам нужно делать с этим документом. Вы также можете использовать это для всей своей предварительной проверки с помощью файла схемы.

Возможно, опция Marc для передачи этих данных в хранимую процедуру может работать и в этом сценарии, но SSIS (или даже DTS, но вы откажетесь от слишком большого числа связанных с XML, чтобы сделать его приятным вариантом) позволит вам визуально организовать всю эту работу. Кроме того, это упростит выполнение этих задач, поэтому вы должны получить гораздо более масштабируемое решение.

0

Подтверждением я имею в виду проверку каждого узла. Узлы, которые имеют хотя бы одну ошибку, должны быть вставлены в новый XML-документ. В основном в конце я должен иметь 2 xml документа. Один из них содержит успешные узлы, а другой - узлы отказа. Как я могу это сделать? Я использую LINQ.

1

Я согласен с идеей, что вы должны использовать XmlReader, но я думал, что попробую что-то другое.

В принципе, я сначала проверяю весь XDocument, а затем, если есть ошибки, я перечисляю их по заказам и вывожу их по мере необходимости. Это некрасиво, но, возможно, это даст вам некоторые идеи.

 XDocument doc = XDocument.Load("sample.xml"); 
     XmlSchemaSet schemas = new XmlSchemaSet(); 
     schemas.Add("", "sample.xsd"); 

     bool errors = false; 
     doc.Validate(schemas, (sender, e) => 
     { 
      errors = true; 
     }); 

     List<XElement> good = new List<XElement>(); 
     List<XElement> bad = new List<XElement>(); 
     var orders = doc.Descendants("Order"); 
     if (errors) 
     { 
      foreach (var order in orders) 
      { 
       errors = false; 
       order.Validate(order.GetSchemaInfo().SchemaElement, schemas, (sender, e) => 
       { 
        errors = true; 
       }); 

       if (errors) 
        bad.Add(order); 
       else 
        good.Add(order); 
      } 
     } 
     else 
     { 
      good = orders.ToList(); 
     } 

Вместо выражений лямбда вы можете использовать общую функцию, но я просто выбросил это вместе. Кроме того, вы можете создать два XDocuments вместо того, чтобы вставлять элементы заказа в список. Я уверен, что здесь тоже много проблем, но, возможно, это что-то зажжет.

+0

+1 для проверки схемы и использования Linq/Lambda – scarpacci 2011-10-29 14:22:09

Смежные вопросы