function readSegments() { $specs = $this->getSpecs(); /** * Premier segment/groupe dans le fichier de spec * * @var CHL7v2DOMElement $current_node */ $current_node = $specs->query("/message/segments/*")->item(0); /** * Groupe courant dans lequel on va placer les CHL7v2Segment créés * * @var CHL7v2SegmentGroup $current_group */ $current_group = $this; //$lines_count = count($this->lines); $n = 100000; // pour eviter les boucles infinies ! while ($n-- && trim($this->getCurrentLine())) { if (!$current_node) { $segment_error = new CHL7v2Segment($current_group); $segment_error->name = $this->getCurrentLineHeader(); $this->error(CHL7v2Exception::UNEXPECTED_SEGMENT, $this->getCurrentLine(), $segment_error); break; } switch ($current_node->nodeName) { // SEGMENT // case "segment": CHL7v2::d($current_node->getSegmentHeader() . " " . $current_node->state(), "red"); $handled = false; if ($this->getCurrentLineHeader() == "") { break 2; } $seg_schema = $this->getSchema(self::PREFIX_SEGMENT_NAME, $this->getCurrentLineHeader(), $this->getMessage()->extension); if ($seg_schema == false) { $segment_error = new CHL7v2Segment($current_group); $segment_error->name = $this->getCurrentLineHeader(); $this->error(CHL7v2Exception::UNKOWN_SEGMENT_TYPE, $this->getCurrentLine(), $segment_error); break 2; } // Si la spec correspond a la ligne courante if ($this->getCurrentLineHeader() == $current_node->getSegmentHeader()) { $this->handleLine($current_node, $current_group); $current_node->markNotEmpty(); $handled = true; } elseif (!$current_node->isRequired()) { CHL7v2::d(" --> Segment non présent et non requis"); list($current_node, $current_group) = self::getNext($current_node, $current_group); break; } else { if (!$current_node->getParent() || $current_node->getParent()->isOpen()) { CHL7v2::d(" --> !!!!!!!!!!!!!!!!! Segment non present et groupe requis"); $this->error(CHL7v2Exception::SEGMENT_MISSING, $current_node->nodeValue); } } // le segment est multiple, on reste sur lui if ($handled && $current_node->isUnbounded()) { CHL7v2::d(" --> Segment multiple"); } else { CHL7v2::d(" --> Segment unique, passage au suivant"); list($current_node, $current_group) = self::getNext($current_node, $current_group); } break; // GROUP // // GROUP // case "group": CHL7v2::d($current_group->name . " " . $current_node->state(), "red"); $current_node->markEmpty(); if ($current_node->isUnbounded() || !$current_node->isUsed()) { $current_node->setAttribute("mbOpen", 0); CHL7v2::d(" --> Groupe multiple ou pas encore utilisé, on entre dedans"); $current_group = new CHL7v2SegmentGroup($current_group, $current_node); $current_node = $current_node->getFirstChild(); } else { CHL7v2::d(" --> Groupe utilisé ou pas multiple, on prend le parent ou frere"); list($current_node, $current_group) = self::getNext($current_node, $current_group); } break; // custom attributes, should never get there // custom attributes, should never get there default: CHL7v2::d($current_node->getName()); $current_node = $current_node->getNextSibling(); break; } } $this->purgeEmptyGroups(); // pas forcément utile : mais ceci donne tous les segments dans // l'ordre de parcours, comme si on le faisait recursivement // $c = $specs->xpath("//segment | //group"); }