c #: Использование Linq для получения неисчислимой коллекции XML-узлов для обхода

#c# #sql #xml #linq

#c# #sql #xml #linq

Вопрос:

У меня есть некоторый код, который использует следующий XML-файл. Кто-нибудь может сказать мне, почему мой документ.Потомки возвращают null?

Вот XML-файл:

 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <EmployerTPASeparationResponseCollection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://uidataexchange.org/schemas SeparationResponse.xsd" xmlns="https://uidataexchange.org/schemas">
   <EmployerTPASeparationResponse>
    <StateRequestRecordGUID>94321098761987654321323456109883</StateRequestRecordGUID>
    <BrokerRecordTransactionNumber>123456789</BrokerRecordTransactionNumber>
    <SSN>999999999</SSN>
    <ClaimEffectiveDate>2011-02-09</ClaimEffectiveDate>
    <ClaimNumber>1234568010</ClaimNumber>
    <StateEmployerAccountNbr>12345689</StateEmployerAccountNbr>
    <ClaimantJobTitle>Assistant Manager</ClaimantJobTitle>
    <EmployerReportedClaimantFirstDayofWork>2009-02-02</EmployerReportedClaimantFirstDayofWork>
    <EmployerReportedClaimantLastDayofWork>2010-03-16</EmployerReportedClaimantLastDayofWork>
    <TotalEarnedWagesNeededInd>2</TotalEarnedWagesNeededInd>
    <TotalEarnedWages>15000.00</TotalEarnedWages>
    <WagesEarnedAfterClaimEffectiveDate>20000.00</WagesEarnedAfterClaimEffectiveDate>
<NumberOfHoursWorkedAfterClaimEffectiveDate>80</NumberOfHoursWorkedAfterClaimEffectiveDate>
    <AverageWeeklyWage>10.00</AverageWeeklyWage>
    <EmployerSepReasonCode>2</EmployerSepReasonCode>
    <EmployerSepReasonComments>Expected return date back to work is 4/25/11</EmployerSepReasonComments>
    <PreparerTypeCode>T</PreparerTypeCode>
    <PreparerCompanyName>Barnett Associates</PreparerCompanyName> 
    <PreparerTelephoneNumberPlusExt>5555555555</PreparerTelephoneNumberPlusExt>
    <PreparerContactName>Diana Turkoane</PreparerContactName>
    <PreparerTitle>CSR</PreparerTitle>
    <PreparerFaxNbr>5555555555</PreparerFaxNbr>
    <PreparerEmailAddress>asdf@asdf.com</PreparerEmailAddress>
  </EmployerTPASeparationResponse>
    <EmployerTPASeparationResponse>
    <StateRequestRecordGUID>94321098761987654321323456109884</StateRequestRecordGUID>
    <BrokerRecordTransactionNumber>123456789</BrokerRecordTransactionNumber>
    <SSN>999999999</SSN>
    <ClaimEffectiveDate>2011-02-10</ClaimEffectiveDate>
    <ClaimNumber>1234568010</ClaimNumber>
    <StateEmployerAccountNbr>12345689</StateEmployerAccountNbr>
    <ClaimantJobTitle>Assistant Manager</ClaimantJobTitle>
    <EmployerReportedClaimantFirstDayofWork>2009-02-03</EmployerReportedClaimantFirstDayofWork>
    <EmployerReportedClaimantLastDayofWork>2010-03-17</EmployerReportedClaimantLastDayofWork>
    <EmployerSepReasonCode>2</EmployerSepReasonCode>
    <EmployerSepReasonComments>Expected return date back to work is 4/30/11</EmployerSepReasonComments>
    <PreparerTypeCode>T</PreparerTypeCode>
    <PreparerCompanyName>Barnett Associates</PreparerCompanyName>
    <PreparerTelephoneNumberPlusExt>5555555555</PreparerTelephoneNumberPlusExt>
    <PreparerContactName>Diana Turkoane</PreparerContactName>
    <PreparerTitle>CSR</PreparerTitle>
    <PreparerFaxNbr>5555555555</PreparerFaxNbr>
    <PreparerEmailAddress>asdf@asdf.com</PreparerEmailAddress>
  </EmployerTPASeparationResponse>
</EmployerTPASeparationResponseCollection>
  

Вот код, который я использую. Сначала я использую некоторый Linq для получения анонимных значений, затем пытаюсь выполнить цикл по каждому дочернему узлу и заполнить с помощью cmd.parameters.

Вот код:

 XDocument doc = XDocument.Load("XmlString.xml");

var EmployerTPASeparationResponse = 
    from node in doc.Descendants("EmployerTPASeparationResponse")
    select new
    {
        param1 = node.Element("StateRequestRecordGUID").Value,
        param2 = node.Element("BrokerRecordTransactionNumber").Value,
        param3 = node.Element("SSN").Value,
        param4 = node.Element("ClaimEffectiveDate").Value,
        param5 = node.Element("ClaimNumber").Value,
        param6 = node.Element("StateEmployerAccountNbr").Value,
        param7 = node.Element("CorrectedEmployerName").Value,
        param8 = node.Element("CorrectedStateEmployerAccountNbr").Value,
        param9 = node.Element("CorrectedFEIN").Value,
        param10 = node.Element("OtherSSN").Value,
        param11 = node.Element("ClaimantNameWorkedAsForEmployers").Value,
        param12 = node.Element("ClaimantJobTitle").Value,
        param13 = node.Element("SeasonalEmploymentInd").Value,
        param14 = node.Element("EmployerReportedClaimantFirstDayofWork").Value,
        param15 = node.Element("EmployerReportedClaimantLastDayofWork").Value,
        param16 = node.Element("EffectiveSeparationDate").Value,
        param17 = node.Element("TotalEarnedWagesNeededInd").Value,
        param18 = node.Element("TotalEarnedWages").Value,
        param19 = node.Element("TotalWeeksWorkedNeededInd").Value,
        param20 = node.Element("TotalWeeksWorked").Value,
        param21 = node.Element("WagesEarnedAfterClaimEffectiveDate").Value,
        param22 = node.Element("NumberOfHoursWorkedAfterClaimEffectiveDate").Value,
        param23 = node.Element("AverageWeeklyWage").Value,
        param24 = node.Element("EmployerSepReasonCode").Value,
        param25 = node.Element("ReturnToWorkInd").Value,
        param26 = node.Element("ReturnToWorkDate").Value,
        param27 = node.Element("WorkingAllAvailableHoursInd").Value,
        param28 = node.Element("NotWorkingAvailableHoursReason").Value,
        param29 = node.Element("DischargeReasonCode").Value,
        param30 = node.Element("FinalIncidentReason").Value,
        param31 = node.Element("FinalIncidentDate").Value,
        param32 = node.Element("ViolateCompanyPolicyInd").Value,
        param33 = node.Element("DischargePolicyAwareInd").Value,
        param34 = node.Element("DischargePolicyAwareExplanationCode").Value,
        param35 = node.Element("WhoDischargedName").Value,
        param36 = node.Element("WhoDischargedTitle").Value,
        param37 = node.Element("DischargeReasonComments").Value,
        param38 = node.Element("VoluntarySepReasonCode").Value,
        param39 = node.Element("HiringAgreementChangesCode").Value,
        param40 = node.Element("HiringAgreementChangeComments").Value,
        param41 = node.Element("ClaimantActionstoAvoidQuitInd").Value,
        param42 = node.Element("ActionTakenComments").Value,
        param43 = node.Element("ContinuingWorkAvailableInd").Value,
        param44 = node.Element("VoluntarySepReasonComments").Value,
        param45 = node.Element("AmendedResponse").Value,
        param46 = node.Element("AmendedResponseDescription").Value,
        param47 = node.Element("EmployerSepReasonComments").Value,
        param48 = node.Element("LaborDisputeTypeInd").Value,
        param49 = node.Element("AttachmentID").Value,
        param50 = node.Element("MandatoryRetirementInd").Value,
        param51 = node.Element("PriorIncidentID").Value,
        param52 = node.Element("PreparerTypeCode").Value,
        param53 = node.Element("PreparerCompanyName").Value,
        param54 = node.Element("PreparerTelephoneNumberPlusExt").Value,
        param55 = node.Element("PreparerContactName").Value,
        param56 = node.Element("PreparerTitle").Value,
        param57 = node.Element("PreparerFaxNbr").Value,
        param58 = node.Element("PreparerEmailAddress").Value,
    };



foreach (var node in EmployerTPASeparationResponse)
{
    cmd4.Parameters["StateRequestRecordGUID"].Value = node.param1;
    cmd4.Parameters["BrokerRecordTransactionNumber"].Value = node.param2;
    cmd4.Parameters["SSN"].Value = node.param3;
    cmd4.Parameters["ClaimEffectiveDate"].Value = node.param4;
    cmd4.Parameters["ClaimNumber"].Value = node.param5;
    cmd4.Parameters["StateEmployerAccountNbr"].Value = node.param6;
    cmd4.Parameters["CorrectedEmployerName"].Value = node.param7;
    cmd4.Parameters["CorrectedStateEmployerAccountNbr"].Value = node.param8;
    cmd4.Parameters["CorrectedFEIN"].Value = node.param9;
    cmd4.Parameters["OtherSSN"].Value = node.param10;
    cmd4.Parameters["ClaimantNameWorkedAsForEmployers"].Value = node.param11;
    cmd4.Parameters["ClaimantJobTitle"].Value = node.param12;
    cmd4.Parameters["SeasonalEmploymentInd"].Value = node.param13;
    cmd4.Parameters["EmployerReportedClaimantFirstDayofWork"].Value = node.param14;
    cmd4.Parameters["EmployerReportedClaimantLastDayofWork"].Value = node.param15;
    cmd4.Parameters["EffectiveSeparationDate"].Value = node.param16;
    cmd4.Parameters["TotalEarnedWagesNeededInd"].Value = node.param17;
    cmd4.Parameters["TotalEarnedWages"].Value = node.param18;
    cmd4.Parameters["TotalWeeksWorkedNeededInd"].Value = node.param19;
    cmd4.Parameters["TotalWeeksWorked"].Value = node.param20;
    cmd4.Parameters["WagesEarnedAfterClaimEffectiveDate"].Value = node.param21;
    cmd4.Parameters["NumberOfHoursWorkedAfterClaimEffectiveDate"].Value = node.param22;
    cmd4.Parameters["AverageWeeklyWage"].Value = node.param23;
    cmd4.Parameters["EmployerSepReasonCode"].Value = node.param24;
    cmd4.Parameters["ReturnToWorkInd"].Value = node.param25;
    cmd4.Parameters["ReturnToWorkDate"].Value = node.param26;
    cmd4.Parameters["WorkingAllAvailableHoursInd"].Value = node.param27;
    cmd4.Parameters["NotWorkingAvailableHoursReason"].Value = node.param28;
    cmd4.Parameters["DischargeReasonCode"].Value = node.param29;
    cmd4.Parameters["FinalIncidentReason"].Value = node.param30;
    cmd4.Parameters["FinalIncidentDate"].Value = node.param31;
    cmd4.Parameters["ViolateCompanyPolicyInd"].Value = node.param32;
    cmd4.Parameters["DischargePolicyAwareInd"].Value = node.param33;
    cmd4.Parameters["DischargePolicyAwareExplanationCode"].Value = node.param34;
    cmd4.Parameters["WhoDischargedName"].Value = node.param35;
    cmd4.Parameters["WhoDischargedTitle"].Value = node.param36;
    cmd4.Parameters["DischargeReasonComments"].Value = node.param37;
    cmd4.Parameters["VoluntarySepReasonCode"].Value = node.param38;
    cmd4.Parameters["HiringAgreementChangesCode"].Value = node.param39;
    cmd4.Parameters["HiringAgreementChangeComments"].Value = node.param40;
    cmd4.Parameters["ClaimantActionstoAvoidQuitInd"].Value = node.param41;
    cmd4.Parameters["ActionTakenComments"].Value = node.param42;
    cmd4.Parameters["ContinuingWorkAvailableInd"].Value = node.param43;
    cmd4.Parameters["VoluntarySepReasonComments"].Value = node.param44;
    cmd4.Parameters["AmendedResponse"].Value = node.param45;
    cmd4.Parameters["AmendedResponseDescription"].Value = node.param46;
    cmd4.Parameters["EmployerSepReasonComments"].Value = node.param47;
    cmd4.Parameters["LaborDisputeTypeInd"].Value = node.param48;
    cmd4.Parameters["AttachmentID"].Value = node.param49;
    cmd4.Parameters["MandatoryRetirementInd"].Value = node.param50;
    cmd4.Parameters["PriorIncidentID"].Value = node.param51;
    cmd4.Parameters["PreparerTypeCode"].Value = node.param52;
    cmd4.Parameters["PreparerCompanyName"].Value = node.param53;
    cmd4.Parameters["PreparerTelephoneNumberPlusExt"].Value = node.param54;
    cmd4.Parameters["PreparerContactName"].Value = node.param55;
    cmd4.Parameters["PreparerTitle"].Value = node.param56;
    cmd4.Parameters["PreparerFaxNbr"].Value = node.param57;
    cmd4.Parameters["PreparerEmailAddress"].Value = node.param58;
    cmd4.ExecuteNonQuery();
    if (cmd4 != null)
    {
        cmd4 = null;
    }
}
  

Комментарии:

1. Вам следует использовать лучшие имена в вашем анонимном типе.

Ответ №1:

Вам необходимо включить пространство имен ( xmlns ) во все имена элементов:

 XNamespace ns = "https://uidataexchange.org/schemas";

doc.Descendants(ns   "EmployerTPASeparationResponse")
  

(И во всех Element вызовах)

Обратите внимание, что ваш код может быть значительно сокращен путем перебора дочерних элементов и добавления параметров с их именами вместо использования анонимных типов.

Например:

 var node = doc.Descendants(ns   "EmployerTPASeparationResponse").Single();

using (cmd4) {
    foreach(var param in node.Elements()) {
        cmd4.Parameters.AddWithValue(param.Name.LocalName, param.Value);
    }
    cmd4.ExecuteNonQuery();
}
  

Комментарии:

1. есть ли пространство имен, которое мне нужно включить, чтобы получить параметр. Параметр localName?

2. @Zach: Извините; я имел в виду .Name.LocalName .

3. @Slaks: для параметра.Value я получаю сообщение об ошибке не удается преобразовать в строку типа из system.data.sqlclient.sqlparameter

4. У меня тоже нет такой возможности.