XmlObject::asXml()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 1
c 1
b 0
f 0
nc 1
nop 0
dl 0
loc 3
rs 10
1
<?php
2
3
/**
4
 * This file is part of byrokrat\giroapp.
5
 *
6
 * byrokrat\giroapp is free software: you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License as published
8
 * by the Free Software Foundation, either version 3 of the License, or
9
 * (at your option) any later version.
10
 *
11
 * byrokrat\giroapp is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with byrokrat\giroapp. If not, see <http://www.gnu.org/licenses/>.
18
 *
19
 * Copyright 2016-21 Hannes Forsgård
20
 */
21
22
declare(strict_types=1);
23
24
namespace byrokrat\giroapp\Xml;
25
26
use byrokrat\giroapp\Exception\InvalidXmlException;
27
use byrokrat\giroapp\Validator\ValidatorInterface;
28
29
/**
30
 * Works as a facade to the actual xml processing
31
 */
32
class XmlObject
33
{
34
    /**
35
     * @var \SimpleXMLElement
36
     */
37
    private $xml;
38
39
    /**
40
     * @throws InvalidXmlException If $content is not valid xml
41
     */
42
    public function __construct(string $content)
43
    {
44
        try {
45
            $this->xml = @new \SimpleXMLElement($content);
46
        } catch (\Exception $e) {
47
            throw new InvalidXmlException($e->getMessage());
48
        }
49
    }
50
51
    public static function fromString(string $content): ?self
52
    {
53
        try {
54
            return new self($content);
55
        } catch (InvalidXmlException $e) {
56
            return null;
57
        }
58
    }
59
60
    /**
61
     * Cast to xml string
62
     */
63
    public function asXml(): string
64
    {
65
        return (string)$this->xml->asXML();
66
    }
67
68
    /**
69
     * Check if element exists
70
     */
71
    public function hasElement(string $path): bool
72
    {
73
        return !!$this->xml->xpath($path);
74
    }
75
76
    /**
77
     * Read the content of the first element matching xpath query
78
     *
79
     * @throws InvalidXmlException If no element matching query is found
80
     */
81
    public function readElement(string $path, ValidatorInterface $validator): string
82
    {
83
        $result = $this->xml->xpath($path);
84
85
        if (empty($result)) {
86
            throw new InvalidXmlException("Unable to find element $path");
87
        }
88
89
        return $validator->validate($path, (string)$result[0]);
90
    }
91
92
    /**
93
     * Generator that yields XmlObject instances with xml subsets
94
     *
95
     * @return iterable<XmlObject>
96
     */
97
    public function getElements(string $path): iterable
98
    {
99
        foreach ((array)$this->xml->xpath($path) as $element) {
100
            if (!$element) {
101
                continue;
102
            }
103
            yield new XmlObject((string)$element->asXML());
104
        }
105
    }
106
}
107