SeibroAssetXrcParser.cs 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. namespace Infrastructure.StockData;
  2. /// <summary>
  3. /// SEIBro getAssetXrcInfo(파생결합증권 기초자산 행사정보) 응답 파서 — 순수 C#. 공용 SeibroXml envelope 입력.
  4. /// 실샘플 래퍼 = &lt;RESULT&gt; **대문자** (readme §1 확정 — 파생결합 5종 중 하나).
  5. /// ⚠️ 응답에 ISIN 이 없어(요청 파라미터로만 받음) 배치가 요청 ISIN 을 스탬핑 — 여기선 (AssetSeq, XrcStdSeq, 값) 반환.
  6. /// 자연키 ASSET_SEQ·XRC_STD_SEQ 없으면 스킵.
  7. /// </summary>
  8. public static class SeibroAssetXrcParser
  9. {
  10. public sealed record Row(
  11. int AssetSeq,
  12. int XrcStdSeq,
  13. decimal? XrcStdRatio,
  14. decimal? XrcPrice
  15. );
  16. public static IReadOnlyList<Row> Parse(SeibroXml.Envelope envelope)
  17. {
  18. var rows = new List<Row>();
  19. foreach (var fields in envelope.Rows)
  20. {
  21. var assetSeq = SeibroFieldParse.Int(SeibroXml.GetOrNull(fields, "ASSET_SEQ"));
  22. var xrcStdSeq = SeibroFieldParse.Int(SeibroXml.GetOrNull(fields, "XRC_STD_SEQ"));
  23. if (assetSeq is null || xrcStdSeq is null)
  24. {
  25. continue;
  26. }
  27. rows.Add(new Row(
  28. assetSeq.Value,
  29. xrcStdSeq.Value,
  30. SeibroFieldParse.Decimal(SeibroXml.GetOrNull(fields, "XRC_STD_RATIO")),
  31. SeibroFieldParse.Decimal(SeibroXml.GetOrNull(fields, "XRC_PRICE"))
  32. ));
  33. }
  34. return rows;
  35. }
  36. }