Xml   A
last analyzed

Complexity

Total Complexity 18

Size/Duplication

Total Lines 149
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 0

Importance

Changes 3
Bugs 2 Features 0
Metric Value
wmc 18
c 3
b 2
f 0
lcom 1
cbo 0
dl 0
loc 149
rs 10

8 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 4 1
A toArray() 0 9 2
A replaceInNode() 0 6 1
A toXml() 0 15 3
A attributes() 0 4 1
A validate() 0 17 3
A getErrors() 0 15 3
A filterEmptyArray() 0 10 4
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);
0 ignored issues
show
Unused Code Comprehensibility introduced by
65% of this comment could be valid code. Did you maybe forget this after debugging?

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.

Loading history...
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
}