1: <?php
2:
3: /**
4: * Picon Framework
5: * http://code.google.com/p/picon-framework/
6: *
7: * Copyright (C) 2011-2012 Martin Cassidy <martin.cassidy@webquub.com>
8:
9: * Picon Framework is free software: you can redistribute it and/or modify
10: * it under the terms of the GNU General Public License as published by
11: * the Free Software Foundation, either version 3 of the License, or
12: * (at your option) any later version.
13:
14: * Picon Framework is distributed in the hope that it will be useful,
15: * but WITHOUT ANY WARRANTY; without even the implied warranty of
16: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17: * General Public License for more details.
18:
19: * You should have received a copy of the GNU General Public License
20: * along with Picon Framework. If not, see <http://www.gnu.org/licenses/>.
21: * */
22:
23: namespace picon;
24:
25: /**
26: * Class representing an XML tag
27: *
28: * @author Martin Cassidy
29: * @package domain/xml
30: */
31: class XMLTag extends ComonDomainBase implements XmlElement
32: {
33: private $name;
34: private $tagType;
35: private $attributes = array();
36: private $children = array();
37:
38: /**
39: * Construct a new xml tag
40: * @param String $name the name of the tag
41: * @param Array $attributes optional, defaults to an empty array
42: */
43: public function __construct($name, $attributes = array())
44: {
45: $this->name = $name;
46: $this->attributes = $attributes;
47:
48: //Open by default
49: $this->tagType = new XmlTagType(XmlTagType::OPEN);
50: }
51:
52: /**
53: * Add a new XMLTag child
54: * @param XMLTag $child the child to add
55: */
56: public function addChild(XmlElement $child)
57: {
58: array_push($this->children, $child);
59: }
60:
61: /**
62: * Set the name of this tag
63: * @param String the name
64: */
65: public function setName($name)
66: {
67: $this->name = $name;
68: }
69:
70: /**
71: * Sets the attributes
72: * @param Array the attributes of this tag
73: */
74: public function setAttributes($attributes)
75: {
76: if(!is_array($attributes))
77: {
78: throw new \InvalidArgumentException(sprintf("Expected array, %s given.", gettype($attributes)));
79: }
80: $this->attributes = $attributes;
81: }
82:
83: public function getName()
84: {
85: return $this->name;
86: }
87:
88: public function getAttributes()
89: {
90: return $this->attributes;
91: }
92:
93: public function getChildren()
94: {
95: return $this->children;
96: }
97:
98: /**
99: * Does this tag have any children
100: * @return boolean true if there are children
101: */
102: public function hasChildren()
103: {
104: return count($this->children)>0;
105: }
106:
107: /**
108: * Set the type of tag this is: open, close, openclose
109: * @param XmlTagType The type
110: */
111: public function setTagType(XmlTagType $type)
112: {
113: $this->tagType = $type;
114: }
115:
116: public function isOpen()
117: {
118: return $this->tagType->equals(new XmlTagType(XmlTagType::OPEN));
119: }
120:
121: public function isClose()
122: {
123: return $this->tagType->equals(new XmlTagType(XmlTagType::CLOSED));
124: }
125:
126: public function isOpenClose()
127: {
128: return $this->tagType->equals(new XmlTagType(XmlTagType::OPENCLOSE));
129: }
130:
131: public function put($name, $value)
132: {
133: $this->attributes[$name] = $value;
134: }
135:
136: /**
137: * Remove an attribute
138: * @param type $name
139: */
140: public function remove($name)
141: {
142: if(array_key_exists($name, $this->attributes))
143: {
144: unset($this->attributes[$name]);
145: }
146: }
147:
148: /**
149: *
150: * @param array $children
151: */
152: public function setChildren($children)
153: {
154: Args::isArray($children, 'children');
155: $this->children = $children;
156: }
157:
158: public function getCharacterData()
159: {
160: $data = "";
161: foreach($this->children as $child)
162: {
163: if($child instanceof TextElement)
164: {
165: $data .= $child->getContent();
166: }
167: }
168: return $data;
169: }
170:
171: public function getChildByName($name)
172: {
173: foreach($this->children as $child)
174: {
175: if($child instanceof XMLTag)
176: {
177: if($child->getName()==$name)
178: {
179: return $child;
180: }
181: if($child->hasChildren())
182: {
183: $found = $child->getChildByName($name);
184: if($found!=null)
185: {
186: return $found;
187: }
188: }
189: }
190: }
191: return null;
192: }
193: }
194:
195: ?>
196: