Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 解析复杂的xml以获取c中的特定节点文本#_C#_Xml_Ssis 2017 - Fatal编程技术网

C# 解析复杂的xml以获取c中的特定节点文本#

C# 解析复杂的xml以获取c中的特定节点文本#,c#,xml,ssis-2017,C#,Xml,Ssis 2017,使用SSIS/C#解析XML文件 从拖车中提取记录计数、从正文中提取TIN并临时存储到变量或某个地方(请给出您的建议)以供进一步处理等操作。我不想把它放在桌子上 请查找下面提到的示例xml <ACOParticipantData xmlns:xsi=""> <Header> <HeaderCode>HDR_PFPRVDR</HeaderCode> <FileCreationDate>20160101</File

使用SSIS/C#解析XML文件

从拖车中提取记录计数、从正文中提取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>

HDR_PFPRVDR
20160101
21
V199
123456789
987654321
1234567890
1234567890
123456
20160101
20161231
TRL_PFPRVDR
20160101
1.

您需要为每个节点创建一个类,并使用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);
        }
    }
}

您需要首先获取
参与者的列表
,然后将所有参与者的tin号提取到列表中,如

在这里,我创建了一个控制台应用程序,用于演示

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();
    }
}
类程序
{
静态void Main(字符串[]参数)
{
XDocument doc=XDocument.Load(@“xml文件的路径”);
List tinList=新列表();
tinList=doc.subjections(“Participants”).Elements().Elements(“TIN”).Select(x=>(long)x.ToList();
foreach(锡表中的长锡)
{
控制台。书写线(tin);
}
Console.ReadLine();
}
}
输出:(针对2名参与者)


您的xml是否有像
xmlns:xsi=“”
这样的空白名称空间,或者它可能包含一些值?没有名称空间标记,无论如何,这真的很重要吗?是的,xml解析取决于名称空间,所以我可以假设没有任何名称空间吗?@er shoaib是的,请您为列表中的所有
参与者
获取所有TIN,对吗?
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();
    }
}