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 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 if(localName != null){
56 if( ! localName.equals(nodeLocalName) ) return false;
59 if(nsuri != null && nodeNsUri != null){
60 if( ! 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 指定名の子要素が存在すればtrue
88 public static boolean hasChild(Element parent,
91 for(Node node = parent.getFirstChild();
93 node = node.getNextSibling() ){
95 if(hasNsLocalNameElem(node, nsuri, localName)){
104 * 指定された名前空間とローカル名に合致する最初の直下子要素を返す。
106 * @param nsuri 名前空間URI
107 * @param localName ローカル名
108 * @return 最初の直下子要素。見つからなければnull。
110 public static Element pickFirstChild(Node parent,
113 Node node = parent.getFirstChild();
115 if(hasNsLocalNameElem(node, nsuri, localName)){
118 node = node.getNextSibling();
120 return (Element) node;
124 * 指定された名前空間とローカル名に合致する最初の直下子要素を返す。
127 * @param nsuri 名前空間URI
128 * @param localName ローカル名
130 * @throws TogaXmlException 1つも見つからなかった
132 public static Element getFirstChild(Element parent,
135 throws TogaXmlException{
136 Element elem = pickFirstChild(parent, nsuri, localName);
139 String message = MessageFormat.format(ERRMSG_NOELEM,
141 parent.getLocalName() );
142 throw new TogaXmlException(message);
149 * 指定された名前の子要素のforeachを返す。
151 * @param nsuri 名前空間URI
152 * @param localName 子要素名
153 * @return 子要素のforeach
155 public static Iterable<Element> getEachChild(final Element parent,
157 final String localName ){
158 Iterable<Element> result = new Iterable<Element>(){
160 public Iterator<Element> iterator(){
161 return new SiblingElemIterator(parent, nsuri, localName);
170 * @param nsuri 名前空間URI
171 * @param localName ローカル名
174 public static boolean hasAttrNS(Element elem,
177 return elem.hasAttributeNS(nsuri, localName);
181 * 要素からxsd:string型属性値を読み取る。
183 * @param nsuri 名前空間URI
184 * @param localName 属性名
186 * @throws TogaXmlException 属性値が見つからなかった。
188 public static String getStringAttrNS(Element elem,
191 throws TogaXmlException{
192 if( ! hasAttrNS(elem, nsuri, localName) ){
193 String message = MessageFormat.format(ERRMSG_NOATTR,
195 elem.getLocalName() );
196 throw new TogaXmlException(message);
201 result = elem.getAttributeNS(nsuri, localName);
202 }catch(DOMException e){
204 throw new AssertionError(e);
211 * 要素からxsd:boolean型属性値を読み取る。
213 * @param nsuri 名前空間URI
214 * @param localName 属性名
216 * @throws TogaXmlException 属性値が見つからなかった。
218 public static boolean getBooleanAttrNS(Element elem,
221 throws TogaXmlException{
222 String value = getStringAttrNS(elem, nsuri, localName);
226 result = DatatypeConverter.parseBoolean(value);
227 }catch(IllegalArgumentException e){
228 String message = MessageFormat.format(ERRMSG_INVATTR,
231 throw new TogaXmlException(message, e);
238 * 要素からxsd:integer型属性値を読み取る。
240 * @param nsuri 名前空間URI
241 * @param localName 属性名
243 * @throws TogaXmlException 属性値が見つからなかった。
245 public static int getIntegerAttrNS(Element elem,
248 throws TogaXmlException{
249 String value = getStringAttrNS(elem, nsuri, localName);
253 result = DatatypeConverter.parseInt(value);
254 }catch(NumberFormatException e){
255 String message = MessageFormat.format(ERRMSG_INVATTR,
258 throw new TogaXmlException(message, e);
265 * 要素からxsd:float型属性値を読み取る。
267 * @param nsuri 名前空間URI
268 * @param localName 属性名
270 * @throws TogaXmlException 属性値が見つからなかった。
272 public static float getFloatAttrNS(Element elem,
275 throws TogaXmlException{
276 String value = getStringAttrNS(elem, nsuri, localName);
280 result = DatatypeConverter.parseFloat(value);
281 }catch(NumberFormatException e){
282 String message = MessageFormat.format(ERRMSG_INVATTR,
285 throw new TogaXmlException(message, e);