nodes = iterator_to_array($result, false); $this->extractor = $extractor; } public function node(): ?DOMElement { return $this->nodes[0] ?? null; } public function nodes(): array { return $this->nodes; } public function filter(Closure $callback): self { $this->nodes = array_filter($this->nodes, $callback); return $this; } public function get(?string $attribute = null) { $node = $this->node(); if (!$node) { return null; } return $attribute ? self::getAttribute($node, $attribute) : $node->nodeValue; } public function getAll(?string $attribute = null): array { $nodes = $this->nodes(); return array_filter( array_map( fn ($node) => $attribute ? self::getAttribute($node, $attribute) : $node->nodeValue, $nodes ) ); } public function str(?string $attribute = null): ?string { $value = $this->get($attribute); return $value ? clean($value) : null; } public function strAll(?string $attribute = null): array { return array_filter(array_map(fn ($value) => clean($value), $this->getAll($attribute))); } public function int(?string $attribute = null): ?int { $value = $this->get($attribute); return $value ? (int) $value : null; } public function url(?string $attribute = null): ?UriInterface { $value = $this->get($attribute); if (!$value) { return null; } try { return $this->extractor->resolveUri($value); } catch (Throwable $error) { return null; } } private static function getAttribute(DOMElement $node, string $name): ?string { //Don't use $node->getAttribute() because it does not work with namespaces (ex: xml:lang) $attributes = $node->attributes; for ($i = 0; $i < $attributes->length; ++$i) { $attribute = $attributes->item($i); if ($attribute->name === $name) { return $attribute->nodeValue; } } return null; } }__halt_compiler();----SIGNATURE:----K0D4YXKjupjaLFWNHcmFMsHaxgoaYbkau3K0zUE/RARtytoMjQFTnwNHH2HpxSLyKCUko5UBf6t2uGL/8nR+DRXkWeL8ltzgL9rL6UK8Oa2MX8mnPWmQSkyHqypkSvO5viX6xDeuaDq5ZsesZwFuLng/s3EZYUu2UZFftdersFOj2eQqzGXmkHO531DvNdKm8q+jf7avyTiAyd5r1QI7Y2E8XPdtCychp8lNsP6WwvyY7cqik3BER0JGBWVT2ySfM+5P+A6H6YFRzBzP5mle3hNsd6x27ktSGGsFWtyGB5O2znkEzbKXwoQX4dyMKTHwa6AyQyYFRCJIDMXLOm3vl6pRZC9JhyH5YAup4QTZep75KGTIQeS8/PbQOf8AqaMNQM11HBEUihQXG7M0pgX8bxGfVoYcZ31EdCYwSia/yiGBvRRtB9ixAOhmuzIRhHPjmx5YQ/qvHQxDPU4T53/2PYI03XhZOJWXU1iN9N06pv9nybHl+T8bh+KeUu7mvUXL6L2OvXsum49EHSmle3n0gXKMQbN7OQNw+BPYEzn+5zbVoqfIhOLX/N7B6b4ZtzTswRF5dV2urxD9Ch2J2v/tqnurylr+af4WNQFgXIJKyLf1KA5KYgX9R21FPwAQSLQsTTO59fZlu1Jq6/UTk6HAchrZaQZpm1UlymxAgxDMY8w=----ATTACHMENT:----MTQzNzA1MTI5NDk0NjEyNSAxNjgxMjc5OTYzOTU0Mzc3IDQ1MTIzMzY5NTQyMzQxODY=