4 * License : The MIT License
\r
5 * Copyright(c) 2010 MikuToga Partners
\r
8 package jp.sourceforge.mikutoga.xml;
\r
10 import java.util.Iterator;
\r
11 import java.util.LinkedList;
\r
12 import java.util.List;
\r
13 import java.util.NoSuchElementException;
\r
14 import javax.xml.bind.DatatypeConverter;
\r
15 import org.w3c.dom.Element;
\r
16 import org.w3c.dom.Node;
\r
21 public final class DomUtils {
\r
29 throw new AssertionError();
\r
33 * 要素からxsd:string型属性値を読み取る。
\r
35 * @param attrName 属性名
\r
37 * @throw TogaXmlException 属性値が見つからなかった。
\r
39 public static String getStringAttr(Element elem, String attrName)
\r
40 throws TogaXmlException{
\r
41 if( ! elem.hasAttribute(attrName) ){
\r
42 String message = "Attr:[" + attrName + "] "
\r
43 + "was not found in "
\r
44 + "Elem:[" + elem.getTagName()+"]";
\r
45 throw new TogaXmlException(message);
\r
50 result = elem.getAttribute(attrName);
\r
51 }catch(IllegalArgumentException e){
\r
52 String message = "Invalid attribute form [" + attrName + "]";
\r
53 throw new TogaXmlException(message, e);
\r
60 * 要素からxsd:boolean型属性値を読み取る。
\r
62 * @param attrName 属性名
\r
64 * @throw TogaXmlException 属性値が見つからなかった。
\r
66 public static boolean getBooleanAttr(Element elem, String attrName)
\r
67 throws TogaXmlException{
\r
68 String value = getStringAttr(elem, attrName);
\r
72 result = DatatypeConverter.parseBoolean(value);
\r
73 }catch(IllegalArgumentException e){
\r
75 "Invalid boolean attribute form "
\r
76 + "[" + attrName + "][" + value + "]";
\r
77 throw new TogaXmlException(message, e);
\r
84 * 要素からxsd:integer型属性値を読み取る。
\r
86 * @param attrName 属性名
\r
88 * @throw TogaXmlException 属性値が見つからなかった。
\r
90 public static int getIntegerAttr(Element elem, String attrName)
\r
91 throws TogaXmlException{
\r
92 String value = getStringAttr(elem, attrName);
\r
96 result = DatatypeConverter.parseInt(value);
\r
97 }catch(IllegalArgumentException e){
\r
99 "Invalid integer attribute form "
\r
100 + "[" + attrName + "][" + value + "]";
\r
101 throw new TogaXmlException(message, e);
\r
108 * 要素からxsd:float型属性値を読み取る。
\r
110 * @param attrName 属性名
\r
112 * @throw TogaXmlException 属性値が見つからなかった。
\r
114 public static float getFloatAttr(Element elem, String attrName)
\r
115 throws TogaXmlException{
\r
116 String value = getStringAttr(elem, attrName);
\r
120 result = DatatypeConverter.parseFloat(value);
\r
121 }catch(IllegalArgumentException e){
\r
123 "Invalid float attribute form "
\r
124 + "[" + attrName + "][" + value + "]";
\r
125 throw new TogaXmlException(message, e);
\r
132 * 要素から日本語Windows用ファイル名を属性値として読み取る。
\r
133 * 念のため文字U+00A5は文字U-005Cに変換される。
\r
135 * @param attrName 属性名
\r
137 * @throw TogaXmlException 属性値が見つからなかった。
\r
139 public static String getSjisFileNameAttr(Element elem, String attrName)
\r
140 throws TogaXmlException{
\r
143 result = getStringAttr(elem, attrName);
\r
144 }catch(IllegalArgumentException e){
\r
146 "Invalid winfile attribute form "
\r
147 + "[" + attrName + "]";
\r
148 throw new TogaXmlException(message, e);
\r
151 result.replace("" + '\u00a5', "" + '\u005c\u005c');
\r
157 * 指定された名前の子要素を1つだけ返す。
\r
158 * @param parent 親要素
\r
159 * @param tagName 子要素名
\r
161 * @throw TogaXmlException 1つも見つからなかった
\r
163 public static Element getChild(Element parent, String tagName)
\r
164 throws TogaXmlException{
\r
165 Element result = null;
\r
167 for(Node node = parent.getFirstChild();
\r
169 node = node.getNextSibling() ){
\r
171 if(node.getNodeType() != Node.ELEMENT_NODE) continue;
\r
172 Element elem = (Element) node;
\r
174 String elemTagName = elem.getTagName();
\r
175 if( tagName.equals(elemTagName) ){
\r
181 if(result == null){
\r
183 "Elem:[" + tagName + "] was not found in "
\r
184 +"Elem:[" + parent.getTagName() + "]";
\r
185 throw new TogaXmlException(message);
\r
192 * 親要素が指定された名前の子要素を持つか判定する。
\r
193 * @param parent 親要素
\r
194 * @param tagName 子要素名
\r
195 * @return 指定名の子要素が存在すればtrue
\r
197 public static boolean hasChild(Element parent, String tagName){
\r
198 for(Node node = parent.getFirstChild();
\r
200 node = node.getNextSibling() ){
\r
202 if(node.getNodeType() != Node.ELEMENT_NODE) continue;
\r
203 Element elem = (Element) node;
\r
205 String elemTagName = elem.getTagName();
\r
206 if( tagName.equals(elemTagName) ) return true;
\r
213 * 指定された名前の子要素のリストを返す。
\r
214 * @param parent 親要素
\r
215 * @param childTag 子要素名
\r
218 public static List<Element> getChildList(Element parent,
\r
220 List<Element> result = new LinkedList<Element>();
\r
222 for(Node node = parent.getFirstChild();
\r
224 node = node.getNextSibling() ){
\r
226 if(node.getNodeType() != Node.ELEMENT_NODE) continue;
\r
227 Element elem = (Element) node;
\r
229 String tagName = elem.getTagName();
\r
230 if( ! childTag.equals(tagName) ) continue;
\r
239 * 指定された名前の子要素の列挙子を返す。
\r
240 * @param parent 親要素
\r
241 * @param childTag 子要素名
\r
244 public static Iterator<Element> getChildIterator(Element parent,
\r
248 firstElem = getChild(parent, childTag);
\r
249 }catch(TogaXmlException e){
\r
253 Iterator<Element> result = new ElemIterator(firstElem);
\r
259 * 指定された名前の子要素のforeachを返す。
\r
260 * @param parent 親要素
\r
261 * @param childTag 子要素名
\r
262 * @return 子要素のforeach
\r
264 public static Iterable<Element> getEachChild(Element parent,
\r
266 final Iterator<Element> iterator = getChildIterator(parent, childTag);
\r
267 Iterable<Element> result = new Iterable<Element>(){
\r
268 public Iterator<Element> iterator(){
\r
278 * @return 次の要素。なければnull
\r
280 public static Element nextElement(Element elem){
\r
281 Node nextNode = elem;
\r
283 nextNode = nextNode.getNextSibling();
\r
284 if(nextNode == null) break;
\r
285 if(nextNode.getNodeType() == Node.ELEMENT_NODE){
\r
290 return (Element) nextNode;
\r
296 * @return 次の要素。なければnull
\r
298 public static Element nextNamedElement(Element elem){
\r
299 String tagName = elem.getTagName();
\r
300 Element nextElem = elem;
\r
302 nextElem = nextElement(nextElem);
\r
303 if(nextElem == null) break;
\r
304 if(tagName.equals(nextElem.getTagName())) break;
\r
311 * 同じ親要素と同じ要素名を持つ兄弟要素を列挙する列挙子。
\r
313 private static class ElemIterator implements Iterator<Element>{
\r
314 private Element next;
\r
318 * @param elem 最初の要素。nullを指定すれば空列挙子となる。
\r
320 private ElemIterator(Element elem){
\r
327 * @return {@inheritDoc}
\r
329 public boolean hasNext(){
\r
330 if(this.next == null) return false;
\r
336 * @return {@inheritDoc}
\r
337 * @throws NoSuchElementException {@inheritDoc}
\r
339 public Element next() throws NoSuchElementException{
\r
340 if(this.next == null) throw new NoSuchElementException();
\r
341 Element result = this.next;
\r
342 this.next = nextNamedElement(this.next);
\r
350 public void remove(){
\r
351 throw new UnsupportedOperationException();
\r