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;
18 * <p>各種名前空間引数にnullが渡された場合、全ての名前空間にマッチする。
19 * <p>各種ローカル名引数にnullが渡された場合、全てのローカル名にマッチする。
20 * <p>ノードの持つ名前空間がnullの場合、全ての名前空間引数にマッチする。
22 public final class DomNsUtils {
24 private static final String ERRMSG_NOELEM =
25 "Elem:[{0}] was not found in Elem:[{1}]";
26 private static final String ERRMSG_NOATTR =
27 "Attr:[{0}] was not found in Elem:[{1}]";
28 private static final String ERRMSG_INVATTR =
29 "Invalid attribute form Attr[{0}] Value[{1}]";
37 throw new AssertionError();
42 * 名前空間とローカル名が一致するノードか判定する。
44 * @param nsuri 名前空間URI
45 * @param localName ローカル名。
46 * @return ノードの名前空間およびローカル名が一致したらtrue
48 public static boolean hasNsLocalNameNode(Node node,
51 String nodeLocalName = node.getLocalName();
52 String nodeNsUri = node.getNamespaceURI();
54 if(localName != null){
55 if( ! localName.equals(nodeLocalName) ) return false;
58 if(nsuri != null && nodeNsUri != null){
59 if( ! nsuri.equals(nodeNsUri) ) return false;
66 * 名前空間とローカル名が一致する要素か判定する。
68 * @param nsuri 名前空間URI
69 * @param localName ローカル名。
70 * @return 名前空間およびローカル名が一致する要素であればtrue
72 public static boolean hasNsLocalNameElem(Node node,
75 if(node.getNodeType() != Node.ELEMENT_NODE) return false;
76 if( ! hasNsLocalNameNode(node, nsuri, localName) ) return false;
81 * 親要素が指定された名前の子要素を持つか判定する。
83 * @param nsuri 名前空間URI
84 * @param localName ローカル名
85 * @return 指定名の子要素が存在すればtrue
87 public static boolean hasChild(Element parent,
90 for(Node node = parent.getFirstChild();
92 node = node.getNextSibling() ){
94 if(hasNsLocalNameElem(node, nsuri, localName)){
103 * 指定された名前空間とローカル名に合致する最初の直下子要素を返す。
105 * @param nsuri 名前空間URI
106 * @param localName ローカル名
107 * @return 最初の直下子要素。見つからなければnull。
109 public static Element pickFirstChild(Node parent,
112 Node node = parent.getFirstChild();
114 if(hasNsLocalNameElem(node, nsuri, localName)){
117 node = node.getNextSibling();
119 return (Element) node;
123 * 指定された名前空間とローカル名に合致する最初の直下子要素を返す。
126 * @param nsuri 名前空間URI
127 * @param localName ローカル名
129 * @throws TogaXmlException 1つも見つからなかった
131 public static Element getFirstChild(Element parent,
134 throws TogaXmlException{
135 Element elem = pickFirstChild(parent, nsuri, localName);
138 String message = MessageFormat.format(ERRMSG_NOELEM,
140 parent.getLocalName() );
141 throw new TogaXmlException(message);
148 * 指定された名前の子要素のforeachを返す。
150 * @param nsuri 名前空間URI
151 * @param localName 子要素名
152 * @return 子要素のforeach
154 public static Iterable<Element> getEachChild(final Element parent,
156 final String localName ){
157 Iterable<Element> result = new Iterable<Element>(){
159 public Iterator<Element> iterator(){
160 return new SiblingElemIterator(parent, nsuri, localName);
169 * @param nsuri 名前空間URI
170 * @param localName ローカル名
173 public static boolean hasAttrNS(Element elem,
176 return elem.hasAttributeNS(nsuri, localName);
180 * 要素からxsd:string型属性値を読み取る。
182 * @param nsuri 名前空間URI
183 * @param localName 属性名
185 * @throws TogaXmlException 属性値が見つからなかった。
187 public static String getStringAttrNS(Element elem,
190 throws TogaXmlException{
191 if( ! hasAttrNS(elem, nsuri, localName) ){
192 String message = MessageFormat.format(ERRMSG_NOATTR,
194 elem.getLocalName() );
195 throw new TogaXmlException(message);
200 result = elem.getAttributeNS(nsuri, localName);
201 }catch(DOMException e){
203 throw new AssertionError(e);
210 * 要素からxsd:boolean型属性値を読み取る。
212 * @param nsuri 名前空間URI
213 * @param localName 属性名
215 * @throws TogaXmlException 属性値が見つからなかった。
217 public static boolean getBooleanAttrNS(Element elem,
220 throws TogaXmlException{
221 String value = getStringAttrNS(elem, nsuri, localName);
225 result = DatatypeIo.parseBoolean(value);
226 }catch(IllegalArgumentException e){
227 String message = MessageFormat.format(ERRMSG_INVATTR,
230 throw new TogaXmlException(message, e);
237 * 要素からxsd:integer型属性値を読み取る。
239 * @param nsuri 名前空間URI
240 * @param localName 属性名
242 * @throws TogaXmlException 属性値が見つからなかった。
244 public static int getIntegerAttrNS(Element elem,
247 throws TogaXmlException{
248 String value = getStringAttrNS(elem, nsuri, localName);
252 result = DatatypeIo.parseInt(value);
253 }catch(NumberFormatException e){
254 String message = MessageFormat.format(ERRMSG_INVATTR,
257 throw new TogaXmlException(message, e);
264 * 要素からxsd:float型属性値を読み取る。
266 * @param nsuri 名前空間URI
267 * @param localName 属性名
269 * @throws TogaXmlException 属性値が見つからなかった。
271 public static float getFloatAttrNS(Element elem,
274 throws TogaXmlException{
275 String value = getStringAttrNS(elem, nsuri, localName);
279 result = DatatypeIo.parseFloat(value);
280 }catch(NumberFormatException e){
281 String message = MessageFormat.format(ERRMSG_INVATTR,
284 throw new TogaXmlException(message, e);