19 $retval = get_class($obj).
"\n";
21 case ($obj instanceof DOMDocument):
22 $retval .=
"XPath: {$obj->getNodePath()}\n".$obj->saveXML($obj);
24 case ($obj instanceof DOMElement):
25 $retval .=
"XPath: {$obj->getNodePath()}\n".$obj->ownerDocument->saveXML($obj);
27 case ($obj instanceof DOMAttr):
28 $retval .=
"XPath: {$obj->getNodePath()}\n".$obj->ownerDocument->saveXML($obj);
30 case ($obj instanceof DOMNodeList):
31 $retval .=
"NodeList of length {$obj->length}\n";
33 for ($i = 0; $i < $obj->length; $i++) {
34 $retval .=
"Item #$i, " .
xml_debug($obj->item($i));
38 return "Instance of unknown class";
48 if( is_string(
$xml) ) {
49 $this->xml =
new DOMDocument();
50 $this->xml->loadXML(
$xml);
51 } elseif(
$xml instanceof DOMDocument ) {
54 throw new Exception(
"<xml> must be of type DOMDocument in new XMLAsArrayOf...(xml,context)");
56 $this->xpath =
new DOMXPath($this->xml);
60 if( $nodeList->length === 1 ) {
61 $this->context_node = $nodeList->item(0);
63 $this->context_node = $this->xml->documentElement;
68 $this->context_node = $this->xml->documentElement;
71 protected function query(
string $offset ) {
72 if( isset($this->context_node) ) {
73 return $this->xpath->query($offset, $this->context_node);
75 return $this->xpath->query($offset);
79 return $this->xml->saveXML($this->context_node);
81 public function __get(
string $name ) {
82 $class = get_class($this);
83 return new $class($this->xml, $this->
query($name));
85 public function __set(
string $name, $value ) {
86 $this[$name] = $value;
89 return isset($this[$name]);
98 return $this->
query($offset)->length === 1;
101 $nodeList = $this->
query($offset);
102 if( $nodeList->length === 1 )
103 return $nodeList->item(0);
106 $nodeList = $this->
query($offset);
107 if( $nodeList->length === 1 ) {
108 $node = $nodeList->item(0);
109 if($node->parentNode !== NULL) {
110 $node->parentNode->replaceChild($value, $node);
112 } elseif( $nodeList->length === 0 ) {
113 $nodeList->context_node->appendChild($value);
117 $nodeList = $this->
query($offset);
118 if( $nodeList->length === 1 ) {
119 $node = $nodeList->item(0);
120 if($node->parentNode !== NULL) {
121 $node->parentNode->removeChild($node);
129 return $this->
query($offset)->length > 0;
132 return $this->
query($offset);
135 $nodeList = $this->
query($offset);
136 $cur_length = $nodeList->length;
137 $new_length = $value->length;
138 for( $i = 0 ; $i < min($cur_length, $new_length); $i++ ) {
139 $cur_node = $nodeList->item($i);
140 $new_node = $value->item($i);
141 $cur_node->parentNode->replaceChild($new_node, $cur_node);
143 for( $i = min($cur_length, $new_length); $i < $cur_length ; $i++ ) {
144 $cur_node = $nodeList->item($i);
145 $cur_node->parentNode->removeChild($cur_node);
147 for( $i = min($cur_length, $new_length); $i < $new_length ; $i++ ) {
148 $new_node = $value->item($i);
149 $this->context_node->appendChild($new_node);
153 $nodeList = $this->
query($offset);
154 $cur_length = $nodeList->length;
155 for( $i = 0 ; $i < $cur_length ; $i++ ) {
156 $cur_node = $nodeList->item($i);
157 $cur_node->parentNode->removeChild($cur_node);
164 return $this->
query($offset)->length === 1;
167 $nodeList = $this->
query($offset);
168 if( $nodeList->length === 1 ) {
169 return $nodeList->item(0)->nodeValue;
173 $nodeList = $this->
query($offset);
174 if( $nodeList->length === 1 ) {
176 $nodeList->item(0)->nodeValue = $value;
177 }
else if( $nodeList->length === 0 ) {
178 $node = $this->xml->createElement(basename($offset));
179 $node->nodeValue = $value;
180 $this->contextNode->appendChild($node);
184 if( $nodeList->length === 1 ) {
185 $node = $nodeList->item(0);
186 $node->parentNode->removeChild($node);
192 $xml = file_get_contents(
"item-sample.xml");
194 print
"EnumerationA: " . $item_item_data[
'enumeration_a'] .
"\n\n";
195 $item_item_data[
'enumeration_a'] =
"NOOOOOOOOO";
196 print $item_item_data->xml->saveXML();
offsetSet( $offset, $value)
offsetSet( $offset, $value)
offsetSet( $offset, $value)