SeibroShotnByMartParser.cs 1.4 KB

1234567891011121314151617181920212223242526272829303132333435
  1. using System.Globalization;
  2. namespace Infrastructure.StockData;
  3. /// <summary>
  4. /// SEIBro getShotnByMart(시장별 단축코드 조회) 응답 파서 — 순수 C#. "SEIBro 발행회사번호 부트스트랩" (Wave 0).
  5. /// 입력: 공용 SeibroXml envelope. 행 필드: SHOTN_ISIN(단축코드) / KOR_SECN_NM(종목명) / ISSUCO_CUSTNO(발행회사번호).
  6. /// 세 필드 중 하나라도 없거나 회사번호가 비숫자인 행은 건너뛴다 (매핑 불가 행 — upsert 자연키가 성립하지 않음).
  7. /// </summary>
  8. public static class SeibroShotnByMartParser
  9. {
  10. /// <summary>시장별 단축코드 1행</summary>
  11. public sealed record Row(string ShortCode, string Name, int IssucoCustno);
  12. public static IReadOnlyList<Row> Parse(SeibroXml.Envelope envelope)
  13. {
  14. var rows = new List<Row>();
  15. foreach (var fields in envelope.Rows)
  16. {
  17. var shortCode = SeibroXml.GetOrNull(fields, "SHOTN_ISIN")?.Trim();
  18. var name = SeibroXml.GetOrNull(fields, "KOR_SECN_NM")?.Trim();
  19. var custnoRaw = SeibroXml.GetOrNull(fields, "ISSUCO_CUSTNO");
  20. if (string.IsNullOrEmpty(shortCode) || string.IsNullOrEmpty(name) || !int.TryParse(custnoRaw, NumberStyles.Integer, CultureInfo.InvariantCulture, out var custno))
  21. {
  22. continue;
  23. }
  24. rows.Add(new Row(shortCode, name, custno));
  25. }
  26. return rows;
  27. }
  28. }