abstract-sv-wc-api-xml-response.php
3.42 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
<?php
/**
* WooCommerce Plugin Framework
*
* This source file is subject to the GNU General Public License v3.0
* that is bundled with this package in the file license.txt.
* It is also available through the world-wide-web at this URL:
* http://www.gnu.org/licenses/gpl-3.0.html
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@skyverge.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade the plugin to newer
* versions in the future. If you wish to customize the plugin for your
* needs please refer to http://www.skyverge.com
*
* @package SkyVerge/WooCommerce/API/Response
* @author SkyVerge
* @copyright Copyright (c) 2013-2016, SkyVerge, Inc.
* @license http://www.gnu.org/licenses/gpl-3.0.html GNU General Public License v3.0
*/
defined( 'ABSPATH' ) or exit;
if ( ! class_exists( 'SV_WC_API_XML_Response' ) ) :
/**
* Base XML API response class.
*
* @since 4.3.0
*/
abstract class SV_WC_API_XML_Response implements SV_WC_API_Response {
/** @var string string representation of this response */
protected $raw_response_xml;
/** @var SimpleXMLElement XML object */
protected $response_xml;
/** @var array|mixed|object XML data after conversion into an usable object */
protected $response_data;
/**
* Build an XML object from the raw response.
*
* @since 4.3.0
* @param string $raw_response_xml The raw response XML
*/
public function __construct( $raw_response_xml ) {
$this->raw_response_xml = $raw_response_xml;
// LIBXML_NOCDATA ensures that any XML fields wrapped in [CDATA] will be included as text nodes
$this->response_xml = new SimpleXMLElement( $raw_response_xml, LIBXML_NOCDATA );
/**
* workaround to convert the horrible data structure that SimpleXMLElement returns
* and provide a nice array of stdClass objects. Note there is some fidelity lost
* in the conversion (such as attributes), but implementing classes can access
* the response_xml member directly to retrieve them as needed.
*/
$this->response_data = json_decode( json_encode( $this->response_xml ) );
}
/**
* Magic method for getting XML element data. Note the response data has
* already been casted into simple data types (string,int,array) and does not
* require further casting in order to use.
*
* @since 4.3.0
* @param string $key
* @return mixed
*/
public function __get( $key ) {
if ( ! isset( $this->response_data->$key ) ) {
return null;
}
// array cast & empty check prevents fataling on empty stdClass objects
$array = (array) $this->response_data->$key;
if ( empty( $array ) ) {
return null;
}
return $this->response_data->$key;
}
/**
* Get the string representation of this response.
*
* @since 4.3.0
* @return string
*/
public function to_string() {
$response = $this->raw_response_xml;
$dom = new DOMDocument();
// suppress errors for invalid XML syntax issues
if ( @$dom->loadXML( $response ) ) {
$dom->formatOutput = true;
$response = $dom->saveXML();
}
return $response;
}
/**
* Get the string representation of this response with any and all sensitive elements masked
* or removed.
*
* @since 4.3.0
* @see SV_WC_API_Response::to_string_safe()
* @return string
*/
public function to_string_safe() {
return $this->to_string();
}
}
endif; // class exists check