Разбор сложного xml для извлечения текста определенного узла в C#

Разбор XML-файла с использованием SSIS / C#

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

Пожалуйста, найдите образец XML, упомянутый ниже

<ACOParticipantData xmlns:xsi="">
  <Header>
    <HeaderCode>HDR_PFPRVDR</HeaderCode>
    <FileCreationDate>20160101</FileCreationDate>
    <ACOProgCode>21</ACOProgCode>
  </Header>
  <Participants>
    <Participant>
      <ACO_ID>V199</ACO_ID>
      <TIN>123456789</TIN>
      <Old_TIN>987654321</Old_TIN>
      <Org_NPI>1234567890</Org_NPI>
      <Ind_NPI>1234567890</Ind_NPI>
      <CCN>123456</CCN>
      <PRG_Eff_Dt>20160101</PRG_Eff_Dt>
      <PRG_Term_Dt>20161231</PRG_Term_Dt>
    </Participant>
  </Participants>
  <Trailer>
    <TrailerCode>TRL_PFPRVDR</TrailerCode>
    <FileCreationDate>20160101</FileCreationDate>
    <RecordCount>1</RecordCount>
  </Trailer>
</ACOParticipantData>

2 ответа

Решение

Вам нужно получить список первых Participants затем вывести все номера участников в список, как

Здесь я создал консольное приложение для демонстрации.

class Program
{
    static void Main(string[] args)
    {
        XDocument doc = XDocument.Load(@"Path to your xml file");

        List<long> tinList = new List<long>();

        tinList = doc.Descendants("Participants").Elements().Elements("TIN").Select(x => (long)x).ToList();

        foreach (long tin in tinList)
        {
            Console.WriteLine(tin);
        }

        Console.ReadLine();
    }
}

Выход: (для 2 участников)

введите описание изображения здесь

Вам необходимо создать класс для каждого узла и использовать десериализацию XML для создания объекта.

Мне пришлось удалить пустое пространство имен, так как процесс десериализации требует допустимого пространства имен.

Также вы можете изменить тип свойств в соответствии с вашими потребностями.

using System;
using System.IO;
using System.Xml.Serialization;
using System.Linq;

public class Program
{
    public class ACOParticipantData 
    {
        public Header Header { get; set; }
        public Participant[] Participants { get; set; }
    }

    public class Header 
    {
        public string HeaderCode { get; set; }
        public string FileCreationDate { get; set; }
        public string ACOProgCode { get; set; }
    }

    public class Participant 
    {
        public string ACO_ID { get; set; }
        public string TIN { get; set; }
        public string Old_TIN { get; set; }
        public string Org_NPI { get; set; }
        public string Ind_NPI { get; set; }
        public string CCN { get; set; }
        public string PRG_Eff_Dt { get; set; }
        public string PRG_Term_Dt { get; set; }
    }

    public class Trailer 
    {
        public string TrailerCode { get; set; }
        public string FileCreationDate { get; set; }
        public string RecordCount { get; set; }
    }

    public static void Main()
    {
        var xmlString = @"<ACOParticipantData>
          <Header>
            <HeaderCode>HDR_PFPRVDR</HeaderCode>
            <FileCreationDate>20160101</FileCreationDate>
            <ACOProgCode>21</ACOProgCode>
          </Header>
          <Participants>
            <Participant>
              <ACO_ID>V199</ACO_ID>
              <TIN>123456789</TIN>
              <Old_TIN>987654321</Old_TIN>
              <Org_NPI>1234567890</Org_NPI>
              <Ind_NPI>1234567890</Ind_NPI>
              <CCN>123456</CCN>
              <PRG_Eff_Dt>20160101</PRG_Eff_Dt>
              <PRG_Term_Dt>20161231</PRG_Term_Dt>
            </Participant>
            <Participant>
              <ACO_ID>V199</ACO_ID>
              <TIN>123456780</TIN>
              <Old_TIN>987654321</Old_TIN>
              <Org_NPI>1234567890</Org_NPI>
              <Ind_NPI>1234567890</Ind_NPI>
              <CCN>123456</CCN>
              <PRG_Eff_Dt>20160101</PRG_Eff_Dt>
              <PRG_Term_Dt>20161231</PRG_Term_Dt>
            </Participant>
          </Participants>
          <Trailer>
            <TrailerCode>TRL_PFPRVDR</TrailerCode>
            <FileCreationDate>20160101</FileCreationDate>
            <RecordCount>1</RecordCount>
          </Trailer>
        </ACOParticipantData>";

        var serializer = new XmlSerializer(typeof(ACOParticipantData));

        ACOParticipantData obj = null;
        using (var reader = new StringReader(xmlString))
        {
            obj = (ACOParticipantData)serializer.Deserialize(reader);
        }

        if (obj == null) 
        {
            return;
        }

        foreach (var tin in obj.Participants.Select(x => x.TIN)) 
        {
            Console.WriteLine(tin);
        }
    }
}

Выход:

123456789
123456780
Другие вопросы по тегам