2 * XML DOM utilities with namespace
4 * License : The MIT License
5 * Copyright(c) 2011 MikuToga Partners
8 package jp.sourceforge.mikutoga.xml;
10 import java.text.MessageFormat;
11 import java.util.Iterator;
12 import javax.xml.bind.DatatypeConverter;
13 import org.w3c.dom.DOMException;
14 import org.w3c.dom.Element;
15 import org.w3c.dom.Node;
19 * <p>各種名前空間引数にnullが渡された場合、全ての名前空間にマッチする。
20 * <p>各種ローカル名引数にnullが渡された場合、全てのローカル名にマッチする。
21 * <p>ノードの持つ名前空間がnullの場合、全ての名前空間引数にマッチする。
23 public final class DomNsUtils {
25 private static final String ERRMSG_NOELEM =
26 "Elem:[{0}] was not found in Elem:[{1}]";
27 private static final String ERRMSG_NOATTR =
28 "Attr:[{0}] was not found in Elem:[{1}]";
29 private static final String ERRMSG_INVATTR =
30 "Invalid attribute form Attr[{0}] Value[{1}]";
38 throw new AssertionError();
43 * 名前空間とローカル名が一致するノードか判定する。
45 * @param nsuri 名前空間URI
46 * @param localName ローカル名。
47 * @return ノードの名前空間およびローカル名が一致したらtrue
49 public static boolean hasNsLocalNameNode(Node node,
52 String nodeLocalName = node.getLocalName();
53 String nodeNsUri = node.getNamespaceURI();
55 boolean needLocalCmp =
58 nsuri != null && nodeNsUri != null;
60 if(needLocalCmp && ! localName.equals(nodeLocalName) ) return false;
61 if(needUriCmp && ! nsuri.equals(nodeNsUri)) return false;
67 * 名前空間とローカル名が一致する要素か判定する。
69 * @param nsuri 名前空間URI
70 * @param localName ローカル名。
71 * @return 名前空間およびローカル名が一致する要素であればtrue
73 public static boolean hasNsLocalNameElem(Node node,
76 if(node.getNodeType() != Node.ELEMENT_NODE) return false;
77 if( ! hasNsLocalNameNode(node, nsuri, localName) ) return false;
82 * 指定された名前空間とローカル名に合致する最初の直下子要素を返す。
84 * @param nsuri 名前空間URI
85 * @param localName ローカル名
86 * @return 最初の直下子要素。見つからなければnull。
88 public static Element pickFirstChild(Node parent,
91 Node node = parent.getFirstChild();
93 if(hasNsLocalNameElem(node, nsuri, localName)){
96 node = node.getNextSibling();
98 return (Element) node;
102 * 指定された名前空間とローカル名に合致する最初の直下子要素を返す。
105 * @param nsuri 名前空間URI
106 * @param localName ローカル名
108 * @throws TogaXmlException 1つも見つからなかった
110 public static Element getFirstChild(Element parent,
113 throws TogaXmlException{
114 Element elem = pickFirstChild(parent, nsuri, localName);
117 String message = MessageFormat.format(ERRMSG_NOELEM,
119 parent.getLocalName() );
120 throw new TogaXmlException(message);
127 * 指定された名前の子要素のforeachを返す。
129 * @param nsuri 名前空間URI
130 * @param localName 子要素名
131 * @return 子要素のforeach
133 public static Iterable<Element> getEachChild(final Element parent,
135 final String localName ){
136 Iterable<Element> result = new Iterable<Element>(){
138 public Iterator<Element> iterator(){
139 return new SiblingElemIterator(parent, nsuri, localName);
148 * @param nsuri 名前空間URI
149 * @param localName ローカル名
152 public static boolean hasAttrNS(Element elem,
155 return elem.hasAttributeNS(nsuri, localName);
159 * 要素からxsd:string型属性値を読み取る。
161 * @param nsuri 名前空間URI
162 * @param localName 属性名
164 * @throws TogaXmlException 属性値が見つからなかった。
166 public static String getStringAttrNS(Element elem,
169 throws TogaXmlException{
170 if( ! hasAttrNS(elem, nsuri, localName) ){
171 String message = MessageFormat.format(ERRMSG_NOATTR,
173 elem.getLocalName() );
174 throw new TogaXmlException(message);
179 result = elem.getAttributeNS(nsuri, localName);
180 }catch(DOMException e){
182 throw new AssertionError(e);
189 * 要素からxsd:boolean型属性値を読み取る。
191 * @param nsuri 名前空間URI
192 * @param localName 属性名
194 * @throws TogaXmlException 属性値が見つからなかった。
196 public static boolean getBooleanAttrNS(Element elem,
199 throws TogaXmlException{
200 String value = getStringAttrNS(elem, nsuri, localName);
204 result = DatatypeConverter.parseBoolean(value);
205 }catch(IllegalArgumentException e){
206 String message = MessageFormat.format(ERRMSG_INVATTR,
209 throw new TogaXmlException(message, e);
216 * 要素からxsd:integer型属性値を読み取る。
218 * @param nsuri 名前空間URI
219 * @param localName 属性名
221 * @throws TogaXmlException 属性値が見つからなかった。
223 public static int getIntegerAttrNS(Element elem,
226 throws TogaXmlException{
227 String value = getStringAttrNS(elem, nsuri, localName);
231 result = DatatypeConverter.parseInt(value);
232 }catch(NumberFormatException e){
233 String message = MessageFormat.format(ERRMSG_INVATTR,
236 throw new TogaXmlException(message, e);
243 * 要素からxsd:float型属性値を読み取る。
245 * @param nsuri 名前空間URI
246 * @param localName 属性名
248 * @throws TogaXmlException 属性値が見つからなかった。
250 public static float getFloatAttrNS(Element elem,
253 throws TogaXmlException{
254 String value = getStringAttrNS(elem, nsuri, localName);
258 result = DatatypeConverter.parseFloat(value);
259 }catch(NumberFormatException e){
260 String message = MessageFormat.format(ERRMSG_INVATTR,
263 throw new TogaXmlException(message, e);