LINQ to XMLを利用したデータ取得


LINQ"de"XML@HL7

対象

  • HL7形式のデータをC#でごりっとよみこみ、DBに突っ込みたい。
  • XMLを読み込みたいだけ。
  • C#大好きです

上記の人に向けての記事です。
つたないところがあるかと思いますが、間違っていたらコメントにてフォローアップお願いします。

HL7とは?

簡単にいうと、医療情報(健診検査の情報や患者情報、予約だったり、いくら払ったかとか…)を扱う標準規格です。
アメリカ主導の規格ですが、日本でも特定健康診査で行った検査結果を国へ提出する際に利用されるなど、今後も利用拡大が想定される規格です。
ただのXMLではありますが、たとえばこんな感じに記載されています。

gattemu.xml
<?xml version="1.0" encoding="utf-8"?>
<ClinicalDocument xmlns="urn:hl7-org:v3" xsi:schemaLocation="urn:hl7-org:v3 ../XSD/hc08_V08.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <typeId root="2.16.840.1.113883.1.3" extension="POCD_HD000040" />
  <id nullFlavor="NI" />
  <code code="10" codeSystem="1.2.392.200119.6.1001" />
  <effectiveTime value="20130930" />
  <confidentialityCode code="N" />
中略
         <entry>
            <observation classCode="OBS" moodCode="EVN">
              <code code="9N006000000000001" displayName="体重" />
              <value xsi:type="PQ" value="85.0" unit="kg" />
            </observation>
          </entry>
          <entry>
            <observation classCode="OBS" moodCode="EVN">
              <code code="9N011000000000001" displayName="BMI" />
              <value xsi:type="PQ" value="29.6" unit="kg/m2" />
              <interpretationCode code="H" />
              <referenceRange>
                <observationRange classCode="OBS" moodCode="EVN.CRT">
                  <value xsi:type="IVL_PQ">
                    <high value="24.9" unit="kg/m2" />
                  </value>
                </observationRange>
              </referenceRange>
            </observation>
          </entry>
(あとはentryタグの繰り返し)

とりあえずこんなかんじ。

本題にはいりましょ。

LINQ to XMLなんて仰々しい感じで名前はついていますが、所詮はLINQ。
そんなに難しい話ではありません。
本来であれば、XSDをつかって簡単にデータ化できればよかったのですが、
それがXSDが壊れていることがあり、うまくいかなかったのです。ガッテム。

ということで、

 tekitouna.cs
            System.IO.StreamReader sr = new System.IO.StreamReader(strFile);
            XElement elem = XElement.Load(strFile);
            var xdoc = XDocument.Load(strFile);
            XNamespace ex = "urn:hl7-org:v3";
            // 検査結果エレメント
            IEnumerable<XElement> q = from n in xdoc.Descendants(ex + "observation")
                                      select n;

      foreach (var ee in q)
           {
                value = "";
                // 検査内容(コード、検査項目名)
                IEnumerable<XElement> s = from n in ee.Descendants(ex + "code")
                                          select n;

                // 検査結果()
                IEnumerable<XElement> t = from n in ee.Descendants(ex + "value")
                                          select n;
          }

Valueがくるくるっととってこれるようになります。

ほんとうに本当にメモ程度の備忘録ですが、こんなかんじです。