使用 XSD 读取 xml,包括嵌套元素

Read xml using XSD including nested elements

我正在阅读 xml 来自 https://www.usaspending.gov/fpds/fpds.php?detail=c&fiscal_year=2015&stateCode=TX&max_records=10 using the xsd from https://data.usaspending.gov/content/xsd/contracts/PrimeBasicContracts.xsd

我已使用 xsd.exe 将其转换为 class。当我使用此代码读取对象时

XmlSerializer ser = new XmlSerializer(typeof(usaspendingSearchResults));

var fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
var spendingResults = ser.Deserialize(fs) as usaspendingSearchResults;
fs.Dispose();

它将读取所有顶级元素,但所有嵌套属性均为空。如何让反序列化填充所有元素?

您的问题是 XSD 文件指定的 doc 元素的属性与 XML 文件中的实际属性不匹配。如果您将 XML 和 XSD 上传到在线验证器,例如 http://www.freeformatter.com/xml-validator-xsd.html,则可以检查此项。如果这样做,您会看到一堆错误,例如:

Cvc-complex-type.2.4.a: Invalid Content Was Found Starting With Element 'obligatedAmount'. One Of '{"http://www.usaspending.gov/schemas/":record_count}' Is Expected.. Line '1', Column '612'.
Cvc-complex-type.2.4.a: Invalid Content Was Found Starting With Element 'obligatedAmount'. One Of '{"http://www.usaspending.gov/schemas/":record_count}' Is Expected.. Line '1', Column '10492'.
Cvc-complex-type.2.4.a: Invalid Content Was Found Starting With Element 'obligatedAmount'. One Of '{"http://www.usaspending.gov/schemas/":record_count}' Is Expected.. Line '1', Column '20216'.
... Remainder snipped for brevity.

出现错误的原因是,根据 XSD,<doc> 元素应具有以下子元素:

    <xs:element ref="schemas:record_count"/>
    <xs:element ref="schemas:UniqueTransactionID" minOccurs="0"/>
    <xs:element ref="schemas:TransactionStatus" minOccurs="0"/>
    <xs:element ref="schemas:AwardType"/>
    <xs:element ref="schemas:ContractPricing"/>
    <xs:element ref="schemas:ContractingAgency"/>
    <xs:element ref="schemas:DUNSNumber"/>
    <xs:element ref="schemas:parentDUNSNumber"/>
    <xs:element ref="schemas:DateSigned"/>
    <xs:element ref="schemas:ContractDescription"/>
    <xs:element ref="schemas:ReasonForModification"/>
    <xs:element ref="schemas:DollarsObligated"/>
    <xs:element ref="schemas:ExtentCompeted"/>
    <xs:element ref="schemas:FiscalYear"/>
    <xs:element ref="schemas:TransactionNumber"/>
    <xs:element ref="schemas:AgencyID" minOccurs="0"/>
    <xs:element ref="schemas:FundingAgency"/>
    <xs:element ref="schemas:IDVAgency" minOccurs="0"/>
    <xs:element ref="schemas:IDVProcurementInstrumentID"/>
    <xs:element ref="schemas:MajorAgency"/>
    <xs:element ref="schemas:ContractingAgencyCode"/>
    <xs:element ref="schemas:MajorFundingAgency"/>
    <xs:element ref="schemas:ModificationNumber"/>
    <xs:element ref="schemas:PSCCategoryCode"/>
    <xs:element ref="schemas:ParentRecipientOrCompanyName"/>
    <xs:element ref="schemas:PlaceofPerformanceCongDistrict"/>
    <xs:element ref="schemas:PlaceofPerformanceState"/>
    <xs:element ref="schemas:PlaceofPerformanceZipCode"/>
    <xs:element ref="schemas:PrincipalNAICSCode"/>
    <xs:element ref="schemas:ProcurementInstrumentID"/>
    <xs:element ref="schemas:PrincipalPlaceCountyOrCity"/>
    <xs:element ref="schemas:ProductorServiceCode"/>
    <xs:element ref="schemas:ProgramSource"/>
    <xs:element ref="schemas:ProgramSourceAccountCode"/>
    <xs:element ref="schemas:ProgramSourceAgencyCode"/>
    <xs:element ref="schemas:ProgramSourceDescription"/>
    <xs:element ref="schemas:RecipientAddressLine123"/>
    <xs:element ref="schemas:RecipientCity"/>
    <xs:element ref="schemas:RecipientCongressionalDistrict"/>
    <xs:element ref="schemas:RecipientCountyName"/>
    <xs:element ref="schemas:RecipientName"/>
    <xs:element ref="schemas:RecipientOrContractorName"/>
    <xs:element ref="schemas:RecipientState"/>
    <xs:element ref="schemas:RecipientZipCode"/>
    <xs:element ref="schemas:TypeofSpending"/>
    <xs:element ref="schemas:TypeofTransaction"/>
    <xs:element ref="schemas:VendorName" minOccurs="0"/>

事实上,XML 中的 <doc> 个元素有一个不同的、更大的子集,包括

<doc spendingCategory="Contracts">
  <obligatedAmount>169335580</obligatedAmount>
  <baseAndExercisedOptionsValue>169335580.00</baseAndExercisedOptionsValue>
  <baseAndAllOptionsValue>169335580.00</baseAndAllOptionsValue>
  <maj_agency_cat>9700</maj_agency_cat>
  <mod_agency>1700</mod_agency>
  <maj_fund_agency_cat>9700: DEPT OF DEFENSE</maj_fund_agency_cat>
  <contractingOfficeAgencyID>1700: DEPT OF THE NAVY</contractingOfficeAgencyID>
  <contractingOfficeID>N00019:_x0020_NAVAL_x0020_AIR_x0020_SYSTEMS_x0020_COMMAND</contractingOfficeID>
  <fundingRequestingAgencyID>1700</fundingRequestingAgencyID>
  <fundingRequestingOfficeID>N00019</fundingRequestingOfficeID>
  <signedDate>2014-12-12T00:00:00.000</signedDate>
  <effectiveDate>2014-12-12T00:00:00.000</effectiveDate>
  <currentCompletionDate>2021-12-31T00:00:00.000</currentCompletionDate>
  <ultimateCompletionDate>2021-12-31T00:00:00.000</ultimateCompletionDate>
  ... Remainder snipped for brevity.

您应该为 XML 找到正确的 XSD。如果你不能但仍然需要继续,你可以尝试 generate your classes directly from the XML.