【发布时间】:2012-01-24 22:27:14
【问题描述】:
我有一个如下所示的数据表
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 了解不够,不知道如何访问它。再次感谢,如果您需要更多信息,请告诉我。 **
【问题讨论】:
-
您需要保存作为被保险人的每个 InsuredOrPrincipal 元素还是您遇到的第一个元素?可能不止一个。许多 ACORD xml 实现将在单独的 InsuredOrPrincipal 聚合中列出配偶。这是因为 /InsuredOrPrincipalInfo/PersonInfo 在 ACORD 模式中没有重复。有时,第二个实例的角色代码是“Coinsured”。
-
这是一个引用。我只对 xml 的这一部分感兴趣,其余的几乎都是垃圾。
-
@dblood 我已经提出了您在上面提到的与 COinsured 的问题。我想怎么处理这个。我的更新代码如下。谢谢!!
-
我通过另一个类 ' InsuredOrPrincipal[] coInsured = xmlDoc.Root .Descendants("InsuredOrPrincipal") .Select(x => new InsuredOrPrincipal(x)) .Where (ip => ip.InsuredOrPrincipalInfo.InsuredOrPrincipalRoleCd == "Coinsured") .ToArray();
标签: c# linq datatable linq-to-xml ienumerable