|
1
|
|
|
<?php |
|
2
|
|
|
|
|
3
|
|
|
namespace App\Library; |
|
4
|
|
|
|
|
5
|
|
|
class Xml |
|
6
|
|
|
{ |
|
7
|
|
|
/** |
|
8
|
|
|
* xml |
|
9
|
|
|
* @var string |
|
10
|
|
|
*/ |
|
11
|
|
|
protected $xml; |
|
12
|
|
|
|
|
13
|
|
|
/** |
|
14
|
|
|
* XSD validation errors |
|
15
|
|
|
* @var array |
|
16
|
|
|
*/ |
|
17
|
|
|
protected $errors; |
|
18
|
|
|
|
|
19
|
|
|
/** |
|
20
|
|
|
* Constructor |
|
21
|
|
|
* |
|
22
|
|
|
* @param string $xml |
|
23
|
|
|
*/ |
|
24
|
|
|
public function __construct($xml = '') |
|
25
|
|
|
{ |
|
26
|
|
|
$this->xml = $xml; |
|
27
|
|
|
} |
|
28
|
|
|
|
|
29
|
|
|
/** |
|
30
|
|
|
* Gets all XML files from a remote folder |
|
31
|
|
|
* |
|
32
|
|
|
* @param string $xml |
|
33
|
|
|
* @return array |
|
34
|
|
|
*/ |
|
35
|
|
|
public function toArray($xml) |
|
36
|
|
|
{ |
|
37
|
|
|
$xml = $xml ?: $this->xml; |
|
38
|
|
|
//$array = json_decode(str_replace('{"0":" "}','null', json_encode(simplexml_load_string($xml),JSON_NUMERIC_CHECK)), true); |
|
|
|
|
|
|
39
|
|
|
$array = json_decode(str_replace('{"0":" "}', 'null', json_encode(simplexml_load_string($xml))), true); |
|
40
|
|
|
$this->filterEmptyArray($array); |
|
41
|
|
|
|
|
42
|
|
|
return $array; |
|
43
|
|
|
} |
|
44
|
|
|
|
|
45
|
|
|
/** |
|
46
|
|
|
* Replace data in a node |
|
47
|
|
|
* |
|
48
|
|
|
* @param string $xml |
|
49
|
|
|
* @param string $node |
|
50
|
|
|
* @param string $find |
|
51
|
|
|
* @param string $replace |
|
52
|
|
|
* @return string |
|
53
|
|
|
*/ |
|
54
|
|
|
public function replaceInNode($xml, $node, $find, $replace) |
|
55
|
|
|
{ |
|
56
|
|
|
return preg_replace_callback('@(<' . $node . '>)' . $find . '(</' . $node . '>)@s', function($matches) use ($replace) { |
|
57
|
|
|
return str_replace(' ', $replace, $matches[0]); |
|
58
|
|
|
}, $xml); |
|
59
|
|
|
} |
|
60
|
|
|
|
|
61
|
|
|
/** |
|
62
|
|
|
* Converts an xml string into a SimpleXml object |
|
63
|
|
|
* |
|
64
|
|
|
* @param string $xml |
|
65
|
|
|
* @return \SimpleXMLElement|false |
|
66
|
|
|
*/ |
|
67
|
|
|
public function toXml($xml, $namespace = null) |
|
68
|
|
|
{ |
|
69
|
|
|
$xml = $xml ?: $this->xml; |
|
70
|
|
|
|
|
71
|
|
|
libxml_use_internal_errors(true); |
|
72
|
|
|
$xmlDoc = simplexml_load_string($xml, null, 0, $namespace, !is_null($namespace)); |
|
73
|
|
|
|
|
74
|
|
|
if ($xmlDoc === false) { |
|
75
|
|
|
$this->errors = libxml_get_errors(); |
|
76
|
|
|
|
|
77
|
|
|
return false; |
|
78
|
|
|
} |
|
79
|
|
|
|
|
80
|
|
|
return $xmlDoc; |
|
81
|
|
|
} |
|
82
|
|
|
|
|
83
|
|
|
/** |
|
84
|
|
|
* Get an array of attributes from an XML node |
|
85
|
|
|
* @param \SimpleXMLElement $node |
|
86
|
|
|
* @return array |
|
87
|
|
|
*/ |
|
88
|
|
|
public static function attributes($node) |
|
89
|
|
|
{ |
|
90
|
|
|
return current($node->attributes()); |
|
91
|
|
|
} |
|
92
|
|
|
|
|
93
|
|
|
/** |
|
94
|
|
|
* Validates an xml string against |
|
95
|
|
|
* @param string $xml |
|
96
|
|
|
* @param string $xsdPath |
|
97
|
|
|
* @return bool |
|
98
|
|
|
*/ |
|
99
|
|
|
public function validate($xsdPath, $xml = null) |
|
100
|
|
|
{ |
|
101
|
|
|
$xml = $xml ?: $this->xml; |
|
102
|
|
|
|
|
103
|
|
|
libxml_use_internal_errors(true); |
|
104
|
|
|
$xmlDoc = new \DOMDocument(); |
|
105
|
|
|
$xmlDoc->loadXML($xml); |
|
106
|
|
|
|
|
107
|
|
|
if (!$xmlDoc->schemaValidate($xsdPath)) { |
|
108
|
|
|
|
|
109
|
|
|
$this->errors = libxml_get_errors(); |
|
110
|
|
|
|
|
111
|
|
|
return false; |
|
112
|
|
|
} |
|
113
|
|
|
|
|
114
|
|
|
return true; |
|
115
|
|
|
} |
|
116
|
|
|
|
|
117
|
|
|
/** |
|
118
|
|
|
* Validates an xml string against |
|
119
|
|
|
* @param bool $compact |
|
120
|
|
|
* @return array |
|
121
|
|
|
*/ |
|
122
|
|
|
public function getErrors($compact = true) |
|
123
|
|
|
{ |
|
124
|
|
|
$errors = []; |
|
125
|
|
|
|
|
126
|
|
|
if (!$compact) { |
|
127
|
|
|
$errors = $this->errors; |
|
128
|
|
|
} else { |
|
129
|
|
|
|
|
130
|
|
|
foreach ($this->errors as $error) { |
|
131
|
|
|
$errors[] = $error->message; |
|
132
|
|
|
} |
|
133
|
|
|
} |
|
134
|
|
|
|
|
135
|
|
|
return $errors; |
|
136
|
|
|
} |
|
137
|
|
|
|
|
138
|
|
|
/** |
|
139
|
|
|
* Converts empty array nodes into empty strings to corredt the toArray() side effect |
|
140
|
|
|
* |
|
141
|
|
|
* @param array &$array |
|
142
|
|
|
*/ |
|
143
|
|
|
public function filterEmptyArray(array &$array) |
|
144
|
|
|
{ |
|
145
|
|
|
foreach ($array as $key=>&$val) { |
|
146
|
|
|
if (empty($val)) { |
|
147
|
|
|
$array[$key] = ""; |
|
148
|
|
|
} else { |
|
149
|
|
|
is_array($val) && $this->filterEmptyArray($val); |
|
150
|
|
|
} |
|
151
|
|
|
} |
|
152
|
|
|
} |
|
153
|
|
|
} |
Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.
The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.
This check looks for comments that seem to be mostly valid code and reports them.