2 * XML DOM utilities with namespace
4 * License : The MIT License
5 * Copyright(c) 2011 MikuToga Partners
8 package jp.sfjp.mikutoga.xml;
10 import java.text.MessageFormat;
11 import java.util.Iterator;
12 import org.w3c.dom.DOMException;
13 import org.w3c.dom.Element;
14 import org.w3c.dom.Node;
19 * <p>各種名前空間引数にnullが渡された場合、全ての名前空間にマッチする。
21 * <p>各種ローカル名引数にnullが渡された場合、全てのローカル名にマッチする。
23 * <p>ノードの持つ名前空間がnullの場合、全ての名前空間引数にマッチする。
25 public final class DomNsUtils {
27 private static final String ERRMSG_NOELEM =
28 "Elem:[{0}] was not found in Elem:[{1}]";
29 private static final String ERRMSG_NOATTR =
30 "Attr:[{0}] was not found in Elem:[{1}]";
31 private static final String ERRMSG_INVATTR =
32 "Invalid attribute form Attr[{0}] Value[{1}]";
40 throw new AssertionError();
45 * 名前空間とローカル名が一致するノードか判定する。
47 * @param nsuri 名前空間URI
48 * @param localName ローカル名。
49 * @return ノードの名前空間およびローカル名が一致したらtrue
51 public static boolean hasNsLocalNameNode(Node node,
54 String nodeLocalName = node.getLocalName();
55 String nodeNsUri = node.getNamespaceURI();
57 if(localName != null){
58 if( ! localName.equals(nodeLocalName) ) return false;
61 if(nsuri != null && nodeNsUri != null){
62 if( ! nsuri.equals(nodeNsUri) ) return false;
69 * 名前空間とローカル名が一致する要素か判定する。
71 * @param nsuri 名前空間URI
72 * @param localName ローカル名。
73 * @return 名前空間およびローカル名が一致する要素であればtrue
75 public static boolean hasNsLocalNameElem(Node node,
78 if(node.getNodeType() != Node.ELEMENT_NODE) return false;
79 if( ! hasNsLocalNameNode(node, nsuri, localName) ) return false;
84 * 親要素が指定された名前の子要素を持つか判定する。
86 * @param nsuri 名前空間URI
87 * @param localName ローカル名
88 * @return 指定名の子要素が存在すればtrue
90 public static boolean hasChild(Element parent,
93 for(Node node = parent.getFirstChild();
95 node = node.getNextSibling() ){
97 if(hasNsLocalNameElem(node, nsuri, localName)){
106 * 指定された名前空間とローカル名に合致する最初の直下子要素を返す。
108 * @param nsuri 名前空間URI
109 * @param localName ローカル名
110 * @return 最初の直下子要素。見つからなければnull。
112 public static Element pickFirstChild(Node parent,
115 Node node = parent.getFirstChild();
117 if(hasNsLocalNameElem(node, nsuri, localName)){
120 node = node.getNextSibling();
122 return (Element) node;
126 * 指定された名前空間とローカル名に合致する最初の直下子要素を返す。
131 * @param nsuri 名前空間URI
132 * @param localName ローカル名
134 * @throws TogaXmlException 1つも見つからなかった
136 public static Element getFirstChild(Element parent,
139 throws TogaXmlException{
140 Element elem = pickFirstChild(parent, nsuri, localName);
143 String message = MessageFormat.format(ERRMSG_NOELEM,
145 parent.getLocalName() );
146 throw new TogaXmlException(message);
153 * 指定された名前の子要素のforeachを返す。
155 * @param nsuri 名前空間URI
156 * @param localName 子要素名
157 * @return 子要素のforeach
159 public static Iterable<Element> getEachChild(final Element parent,
161 final String localName ){
162 Iterable<Element> result = new Iterable<Element>(){
164 public Iterator<Element> iterator(){
165 return new SiblingElemIterator(parent, nsuri, localName);
174 * @param nsuri 名前空間URI
175 * @param localName ローカル名
178 public static boolean hasAttrNS(Element elem,
181 return elem.hasAttributeNS(nsuri, localName);
185 * 要素からxsd:string型属性値を読み取る。
187 * @param nsuri 名前空間URI
188 * @param localName 属性名
190 * @throws TogaXmlException 属性値が見つからなかった。
192 public static String getStringAttrNS(Element elem,
195 throws TogaXmlException{
196 if( ! hasAttrNS(elem, nsuri, localName) ){
197 String message = MessageFormat.format(ERRMSG_NOATTR,
199 elem.getLocalName() );
200 throw new TogaXmlException(message);
205 result = elem.getAttributeNS(nsuri, localName);
206 }catch(DOMException e){
208 throw new AssertionError(e);
215 * 要素からxsd:boolean型属性値を読み取る。
217 * @param nsuri 名前空間URI
218 * @param localName 属性名
220 * @throws TogaXmlException 属性値が見つからなかった。
222 public static boolean getBooleanAttrNS(Element elem,
225 throws TogaXmlException{
226 String value = getStringAttrNS(elem, nsuri, localName);
230 result = DatatypeIo.parseBoolean(value);
231 }catch(IllegalArgumentException e){
232 String message = MessageFormat.format(ERRMSG_INVATTR,
235 throw new TogaXmlException(message, e);
242 * 要素からxsd:integer型属性値を読み取る。
244 * @param nsuri 名前空間URI
245 * @param localName 属性名
247 * @throws TogaXmlException 属性値が見つからなかった。
249 public static int getIntegerAttrNS(Element elem,
252 throws TogaXmlException{
253 String value = getStringAttrNS(elem, nsuri, localName);
257 result = DatatypeIo.parseInt(value);
258 }catch(NumberFormatException e){
259 String message = MessageFormat.format(ERRMSG_INVATTR,
262 throw new TogaXmlException(message, e);
269 * 要素からxsd:float型属性値を読み取る。
271 * @param nsuri 名前空間URI
272 * @param localName 属性名
274 * @throws TogaXmlException 属性値が見つからなかった。
276 public static float getFloatAttrNS(Element elem,
279 throws TogaXmlException{
280 String value = getStringAttrNS(elem, nsuri, localName);
284 result = DatatypeIo.parseFloat(value);
285 }catch(NumberFormatException e){
286 String message = MessageFormat.format(ERRMSG_INVATTR,
289 throw new TogaXmlException(message, e);