使用 Linq 从 IEnumerable中提取数据并存储在数据表中
我有一个如下所示的数据表
public static DataTable SetColumnHeaders(DataTable KeyDataTable)
{
KeyDataTable.Columns.Add("First_Name", typeof(string));
KeyDataTable.Columns.Add("Last_Name", typeof(string));
KeyDataTable.Columns.Add("Address1", typeof(string));
KeyDataTable.Columns.Add("Address2", typeof(bool));
KeyDataTable.Columns.Add("City", typeof(string));
KeyDataTable.Columns.Add("State", typeof(bool));
KeyDataTable.Columns.Add("Zip", typeof(string));
KeyDataTable.Columns.Add("Zip4", typeof(bool));
KeyDataTable.Columns.Add("Match_File", typeof(bool));
return KeyDataTable;
}
我的目标是从 xml 读取信息并将特定数据存储到我的数据表中。我为每个“报价”都有一个单独的 xml 文件,因此我将在数据表中附加一个新行。我关心的 xml 部分如下:
'- <ACORD>
- <SignonRq>
- <SignonPswd>
- <CustId>
<SPName>com.agencyport</SPName>
</CustId>
- <CustPswd>
<EncryptionTypeCd>NONE</EncryptionTypeCd>
<Pswd>default</Pswd>
</CustPswd>
</SignonPswd>
<ClientDt>2006-04-04T15:44:00</ClientDt>
<CustLangPref>en-US</CustLangPref>
- <ClientApp>
<Org>Applied Systems</Org>
<Name>WinTam</Name>
<Version>7.1.0</Version>
</ClientApp>
</SignonRq>
- <InsuranceSvcRq>
<RqUID>81913CB5-3EAB-F158-EE24-5910F9BE9C26</RqUID>
- <PersAutoPolicyQuoteInqRq>
<RqUID>7B010E52-44F2-487A-521B-9D1E3500C23D</RqUID>
- <Producer id="AB4E95FF02FA91FAA4D7A2D96B59D8866A">
- <ProducerInfo id="AF04551B40F1439BCCC77CA3A21165FFAA">
<ContractNumber id="AD2178F32385016684F33F848830CAA18A">AP</ContractNumber>
</ProducerInfo>
</Producer>
<InsuredOrPrincipal id="A498E0A503206279EE434988B68472974A">
<GeneralPartyInfo id="A4F0BBE53B311050FD0552BB41090A523A">
<NameInfo id="AFBDE1032EEEA0821374C7C9428B0B44CA">
<PersonName id="A883A5BFD8FA8E71F52780B1E678AD64AA">
<Surname id="A40A625346687D257582BF6499710839BA">TEST</Surname>
<GivenName id="A021FD886DAAF628327F542786B6CD9B5A">TEST</GivenName>
<OtherGivenName id="A06DB1E21AF9BD37420B5C39E6562C78AA">TEST</OtherGivenName>
</PersonName>
<TaxIdentity id="ABC2680C3B21A161E54BCDBA78DFCCE77A">
<TaxIdTypeCd id="A050BE41EE9F2B1C713E934B1D6D2B31BA">SSN</TaxIdTypeCd>
</TaxIdentity>
</NameInfo>
<Addr id="A0C5DF11BD2CF70669AE368F685DAD141A">
<AddrTypeCd id="A82658A7F5CEB14239A4023874F594FC9A">MailingAddress</AddrTypeCd>
<Addr1 id="A0DC5C008818A7559527AD40AB1E0D8E0A">100 MAIN ST</Addr1>
<City id="A7DBC851540752437C649745A63508198A">Howell</City>
<StateProvCd id="ACDF462092E91668AD7996C662ACC1622A">MI</StateProvCd>
<PostalCode id="A45C6341382A3314D1EC79FEF20FE9D82A">48843</PostalCode>
<CountryCd id="AD69C7B00BB7F210588E016FF281675F6A">Livingston</CountryCd>
</Addr>
<Communications id="AFC53B2B003342664BE4635C38C7C6C45A">
<PhoneInfo id="AE5497FDB30717F033E8DFA47B3A36142A">
<PhoneTypeCd id="AF8662F35A8F1FD3DD993CECB53EB2FCAA">Phone</PhoneTypeCd>
<CommunicationUseCd id="ADA98E4A9B820C002189B1124F071D462A">Home</CommunicationUseCd>
<PhoneNumber id="A7F0F2A55F636FB6DCED2F6815271B352A">313-272-6576</PhoneNumber>
</PhoneInfo>
</Communications>
</GeneralPartyInfo>
<InsuredOrPrincipalInfo id="A09004254D9A7BE38EA45B20CCD6A0EC2A">
<InsuredOrPrincipalRoleCd id="A2B16D7C6D9CE94DB83DDC6C69BE52BDBA">Insured</InsuredOrPrincipalRoleCd>
<PersonInfo id="AE7CB4EE90C6BEBB1C79DF10415B3B8E5A">
<MiscParty id="A3AC37CD29B32FA46D0204601CE86F0C0A">
<MiscPartyInfo id="A5A9326BB8C3E68900D23F62420A06362A">
<MiscPartyRoleCd id="A92E022991F988677D6EF8434207DDEBBA">Employer</MiscPartyRoleCd>
</MiscPartyInfo>
</MiscParty>
</PersonInfo>
</InsuredOrPrincipalInfo>
</InsuredOrPrincipal>
到目前为止我想到的是:
public static void ExportAutoToText()
{
DirectoryInfo AutoDir = new DirectoryInfo(FilePrep.AutoDirectory);
DataTable AutoDataTable = new DataTable();
AutoDataTable = SetColumnHeaders(AutoDataTable); // set column headers
foreach (FileInfo File in AutoDir.GetFiles())
{
DataRow fileRow = AutoDataTable.NewRow();
XDocument xmlDoc = XDocument.Load(AutoDir + File.Name);
//decide if i want to keep the file
IEnumerable<XElement> personinfo =
from per in xmlDoc.Root.Descendants("InsuredOrPrincipal")
where (string)per.Element("InsuredOrPrincipalInfo")
.Element("InsuredOrPrincipalRoleCd") == ("Insured")
select per;
// I then want to update the information in my datatable
//fileRow["First_Name"] = xVal.Element("GeneralPartyInfo")
// .Element("NameInfo")
// .Element("PersonName")
// .Element("GivenName");
//fileRow["Last_Name"] = xVal.Element("GeneralPartyInfo")
// .Element("NameInfo")
// .Element("PersonName")
// .Element("Surname");
}
}
这个方法位于类内部,因此您可以假设获取文件并且一切正常。我只需要知道从 xml 文件访问数据并将其存储在数据表中的最有效方法。我尝试按如下方式循环数据:
foreach (var Xval in personinfo)
{
//get the element info
}
我只是对 xml 不太了解,不知道如何访问它。再次感谢,如果您需要更多信息,请告诉我。 **
I have a datatable that looks like the following
public static DataTable SetColumnHeaders(DataTable KeyDataTable)
{
KeyDataTable.Columns.Add("First_Name", typeof(string));
KeyDataTable.Columns.Add("Last_Name", typeof(string));
KeyDataTable.Columns.Add("Address1", typeof(string));
KeyDataTable.Columns.Add("Address2", typeof(bool));
KeyDataTable.Columns.Add("City", typeof(string));
KeyDataTable.Columns.Add("State", typeof(bool));
KeyDataTable.Columns.Add("Zip", typeof(string));
KeyDataTable.Columns.Add("Zip4", typeof(bool));
KeyDataTable.Columns.Add("Match_File", typeof(bool));
return KeyDataTable;
}
My goal is to read information in from an xml and store that specific data into my datatable. I have a separate xml file for each "Quote" so I will be appending a new row to the datatable. The part of the xml I am concerned with is as follows:
'- <ACORD>
- <SignonRq>
- <SignonPswd>
- <CustId>
<SPName>com.agencyport</SPName>
</CustId>
- <CustPswd>
<EncryptionTypeCd>NONE</EncryptionTypeCd>
<Pswd>default</Pswd>
</CustPswd>
</SignonPswd>
<ClientDt>2006-04-04T15:44:00</ClientDt>
<CustLangPref>en-US</CustLangPref>
- <ClientApp>
<Org>Applied Systems</Org>
<Name>WinTam</Name>
<Version>7.1.0</Version>
</ClientApp>
</SignonRq>
- <InsuranceSvcRq>
<RqUID>81913CB5-3EAB-F158-EE24-5910F9BE9C26</RqUID>
- <PersAutoPolicyQuoteInqRq>
<RqUID>7B010E52-44F2-487A-521B-9D1E3500C23D</RqUID>
- <Producer id="AB4E95FF02FA91FAA4D7A2D96B59D8866A">
- <ProducerInfo id="AF04551B40F1439BCCC77CA3A21165FFAA">
<ContractNumber id="AD2178F32385016684F33F848830CAA18A">AP</ContractNumber>
</ProducerInfo>
</Producer>
<InsuredOrPrincipal id="A498E0A503206279EE434988B68472974A">
<GeneralPartyInfo id="A4F0BBE53B311050FD0552BB41090A523A">
<NameInfo id="AFBDE1032EEEA0821374C7C9428B0B44CA">
<PersonName id="A883A5BFD8FA8E71F52780B1E678AD64AA">
<Surname id="A40A625346687D257582BF6499710839BA">TEST</Surname>
<GivenName id="A021FD886DAAF628327F542786B6CD9B5A">TEST</GivenName>
<OtherGivenName id="A06DB1E21AF9BD37420B5C39E6562C78AA">TEST</OtherGivenName>
</PersonName>
<TaxIdentity id="ABC2680C3B21A161E54BCDBA78DFCCE77A">
<TaxIdTypeCd id="A050BE41EE9F2B1C713E934B1D6D2B31BA">SSN</TaxIdTypeCd>
</TaxIdentity>
</NameInfo>
<Addr id="A0C5DF11BD2CF70669AE368F685DAD141A">
<AddrTypeCd id="A82658A7F5CEB14239A4023874F594FC9A">MailingAddress</AddrTypeCd>
<Addr1 id="A0DC5C008818A7559527AD40AB1E0D8E0A">100 MAIN ST</Addr1>
<City id="A7DBC851540752437C649745A63508198A">Howell</City>
<StateProvCd id="ACDF462092E91668AD7996C662ACC1622A">MI</StateProvCd>
<PostalCode id="A45C6341382A3314D1EC79FEF20FE9D82A">48843</PostalCode>
<CountryCd id="AD69C7B00BB7F210588E016FF281675F6A">Livingston</CountryCd>
</Addr>
<Communications id="AFC53B2B003342664BE4635C38C7C6C45A">
<PhoneInfo id="AE5497FDB30717F033E8DFA47B3A36142A">
<PhoneTypeCd id="AF8662F35A8F1FD3DD993CECB53EB2FCAA">Phone</PhoneTypeCd>
<CommunicationUseCd id="ADA98E4A9B820C002189B1124F071D462A">Home</CommunicationUseCd>
<PhoneNumber id="A7F0F2A55F636FB6DCED2F6815271B352A">313-272-6576</PhoneNumber>
</PhoneInfo>
</Communications>
</GeneralPartyInfo>
<InsuredOrPrincipalInfo id="A09004254D9A7BE38EA45B20CCD6A0EC2A">
<InsuredOrPrincipalRoleCd id="A2B16D7C6D9CE94DB83DDC6C69BE52BDBA">Insured</InsuredOrPrincipalRoleCd>
<PersonInfo id="AE7CB4EE90C6BEBB1C79DF10415B3B8E5A">
<MiscParty id="A3AC37CD29B32FA46D0204601CE86F0C0A">
<MiscPartyInfo id="A5A9326BB8C3E68900D23F62420A06362A">
<MiscPartyRoleCd id="A92E022991F988677D6EF8434207DDEBBA">Employer</MiscPartyRoleCd>
</MiscPartyInfo>
</MiscParty>
</PersonInfo>
</InsuredOrPrincipalInfo>
</InsuredOrPrincipal>
What I have come up with so far is this:
public static void ExportAutoToText()
{
DirectoryInfo AutoDir = new DirectoryInfo(FilePrep.AutoDirectory);
DataTable AutoDataTable = new DataTable();
AutoDataTable = SetColumnHeaders(AutoDataTable); // set column headers
foreach (FileInfo File in AutoDir.GetFiles())
{
DataRow fileRow = AutoDataTable.NewRow();
XDocument xmlDoc = XDocument.Load(AutoDir + File.Name);
//decide if i want to keep the file
IEnumerable<XElement> personinfo =
from per in xmlDoc.Root.Descendants("InsuredOrPrincipal")
where (string)per.Element("InsuredOrPrincipalInfo")
.Element("InsuredOrPrincipalRoleCd") == ("Insured")
select per;
// I then want to update the information in my datatable
//fileRow["First_Name"] = xVal.Element("GeneralPartyInfo")
// .Element("NameInfo")
// .Element("PersonName")
// .Element("GivenName");
//fileRow["Last_Name"] = xVal.Element("GeneralPartyInfo")
// .Element("NameInfo")
// .Element("PersonName")
// .Element("Surname");
}
}
This method is inside of a Class so you can assume getting the file and everything works just fine. I just need to know the most efficient way of accessing the data from the xml file and storing it in my datatable. I'v tried looping data as follows:
foreach (var Xval in personinfo)
{
//get the element info
}
I just dont know enough about xml to know how to access it.Thanks again and If you need more information please let me know.
**
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
我更喜欢为每个节点级别创建对象。更容易调试和测试。
使用此 xml 库。
您可以为每个部分创建类,例如:
您可以这样使用它:
根据您的需要,您可以根据需要扩展或缩小类的数量以及每个类的信息,但这就是我的处理方式,因为这对我来说更有意义。
使用此代码进行测试:
这给了我预期的输出:
I prefer creating objects for each node level. It is easier to debug and test.
Using this xml library.
You'd create classes for each part, like:
You would use it like this:
Depending on your needs you can expand or shrink the number of classes and information per class as you need, but this is the way I'd go about it, as it makes more sense to me.
Tested with this code:
Which gave me the expected output:
您可以将“isInsured”检查和您对人员的选择烘焙到一个查询中;
就以意外格式处理 XML 而言,这并不是非常强大,但它应该作为您的一个很好的起点。只需使用其余元素填写匿名对象初始化,并转换为所需的类型。
You can bake your "isInsured" check and your selection of a person into the one query;
This isn't super-robust in terms of handling XML in an unexpected format, but it should serve as a good starting point for you. Just fill out the anonymous object initialization with the rest of your elements, casting to the desired types.
这是我到目前为止所拥有的。
Comp 类看起来像这样。
当然,我导出回文本文件以进行追加。
现在,在进行一些处理后,我仍然需要将数据附加回相同的 xml 文件中。我还必须将数据去个性化。所以我假设我只需要做集合而不是获取。尚不确定此过程的语法。如果您有改进建议,请随时发表评论。
This is what I have so far.
The class Comp looks like this.
And Of course my export back to a text file for my append.
Now I still need to append data back into The same xml files after I do some processing. As well as I have to depersonalize the data. So I'm assuming I just need to do sets rather than Gets. Not sure of the syntax for this process yet. If you have suggestions to improve this please feel free to leave a comment.