Каков наилучший способ прочитать файл XML, когда нет стандартной схемы? - PullRequest
0 голосов
/ 28 ноября 2011

Я работаю над приложением, в котором мне нужно каждый раз читать XML-файлы, которые имеют различный набор узлов, хотя во всех файлах появляется только определенное количество узлов, комбинация, в которой они появляются, продолжает изменяться XML-файлы генерируются другой системой, которой я не могу управлять, я изучаю Linq to XML и сериализацию XML, но я полагаю, что сериализация не является выбором, так как для создания объектов требуются предварительно созданные классы.

Пример XML-данных

<Employee>
  <PersonalInfo>
    <FirstName>Vamsi</FirstName>
    <LastName>Krishna</LastName>
  </PersonalInfo>
  <EmploymentInfo>
    <Department>
      <Id>101</Id>
      <Position>SD</Position>
    <Department>
  <EmploymentInfo>
</Employee>

Другой формат

<Employee>
  <PersonalInfo>
    <FirstName>Vamsi</FirstName>
    <LastName>Krishna</LastName>
  </PersonalInfo>      
</Employee>

Вы можете заметить, что узел EmploymentInfo полностью отсутствует во втором примере, есть много комбинаций, в которых данные XML могут быть представлены приложению, я должен прочитать файл XML, чтобы проверить его вставку в SQL База данных сервера через мой код C #.

Ответы [ 2 ]

1 голос
/ 28 ноября 2011

Я бы сказал, что это зависит.

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

Но если вы действительно не можете вывести систему из схем, используемых внешним приложением, и вам нужен какой-то интеллектуальный синтаксический анализатор, вам лучше использовать XPath или Linq to XML или некоторые другие API уровня XML для ручной обработки XML-ов. .

Кстати, оба ваших образца довольно просты для XMLSerializer. Во втором случае он просто установит EmploymentInfo на ноль.

1 голос
/ 28 ноября 2011

Вы можете написать класс синтаксического анализатора, который использует .Net Xpath реализация . Парсер должен проверить дочерние элементы для определенных узлов перед обработкой данных.

Посетите MSDN для получения полного синтаксиса.

Обновление

Небольшой пример того, что я хотел бы сделать, чтобы решить эту проблему. Сначала некоторые классы Model содержат некоторые данные:

public class PersonalInfo 
{
   public string FirstName { get; set;}
   public string LastName { get; set;}
   // more properties
}

public class EmployeeModel 
{
    // remove List<> if you always just have 1 personalinfo child element
    public List<PersonalInfo> {get; set;}   
    public List<EmploymentInfo> {get; set;}
    // more properties
}

Теперь ваш "Парсер":

public class MyParser
{
    // load xml string or xml file in constructor
    public MyParser(string xmlSource) { .. }


    public EmployeeModel GetEmployeeModel()
    {
         var result = new EmployeeModel();
         // use what ever you want to select nodes from your xml
         // and set data of result

         return result;
    }
}

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

...