/* * XML DOM utilities with namespace * * License : The MIT License * Copyright(c) 2011 MikuToga Partners */ package jp.sourceforge.mikutoga.xml; import java.text.MessageFormat; import java.util.Iterator; import javax.xml.bind.DatatypeConverter; import org.w3c.dom.DOMException; import org.w3c.dom.Element; import org.w3c.dom.Node; /** * DOMユーティリティ(名前空間対応)。 *
各種名前空間引数にnullが渡された場合、全ての名前空間にマッチする。 *
各種ローカル名引数にnullが渡された場合、全てのローカル名にマッチする。 *
ノードの持つ名前空間がnullの場合、全ての名前空間引数にマッチする。 */ public final class DomNsUtils { private static final String ERRMSG_NOELEM = "Elem:[{0}] was not found in Elem:[{1}]"; private static final String ERRMSG_NOATTR = "Attr:[{0}] was not found in Elem:[{1}]"; private static final String ERRMSG_INVATTR = "Invalid attribute form Attr[{0}] Value[{1}]"; /** * 隠しコンストラクタ。 */ private DomNsUtils(){ assert false; throw new AssertionError(); } /** * 名前空間とローカル名が一致するノードか判定する。 * @param node ノード * @param nsuri 名前空間URI * @param localName ローカル名。 * @return ノードの名前空間およびローカル名が一致したらtrue */ public static boolean hasNsLocalNameNode(Node node, String nsuri, String localName ){ String nodeLocalName = node.getLocalName(); String nodeNsUri = node.getNamespaceURI(); if(localName != null){ if( ! localName.equals(nodeLocalName) ) return false; } if(nsuri != null && nodeNsUri != null){ if( ! nsuri.equals(nodeNsUri) ) return false; } return true; } /** * 名前空間とローカル名が一致する要素か判定する。 * @param node ノード * @param nsuri 名前空間URI * @param localName ローカル名。 * @return 名前空間およびローカル名が一致する要素であればtrue */ public static boolean hasNsLocalNameElem(Node node, String nsuri, String localName ){ if(node.getNodeType() != Node.ELEMENT_NODE) return false; if( ! hasNsLocalNameNode(node, nsuri, localName) ) return false; return true; } /** * 親要素が指定された名前の子要素を持つか判定する。 * @param parent 親要素 * @param nsuri 名前空間URI * @param localName ローカル名 * @return 指定名の子要素が存在すればtrue */ public static boolean hasChild(Element parent, String nsuri, String localName ){ for(Node node = parent.getFirstChild(); node != null; node = node.getNextSibling() ){ if(hasNsLocalNameElem(node, nsuri, localName)){ return true; } } return false; } /** * 指定された名前空間とローカル名に合致する最初の直下子要素を返す。 * @param parent 親要素 * @param nsuri 名前空間URI * @param localName ローカル名 * @return 最初の直下子要素。見つからなければnull。 */ public static Element pickFirstChild(Node parent, String nsuri, String localName ){ Node node = parent.getFirstChild(); while(node != null){ if(hasNsLocalNameElem(node, nsuri, localName)){ break; } node = node.getNextSibling(); } return (Element) node; } /** * 指定された名前空間とローカル名に合致する最初の直下子要素を返す。 *
見つからなければ例外を投げる。
* @param parent 親要素
* @param nsuri 名前空間URI
* @param localName ローカル名
* @return 最初の直下子要素。
* @throws TogaXmlException 1つも見つからなかった
*/
public static Element getFirstChild(Element parent,
String nsuri,
String localName )
throws TogaXmlException{
Element elem = pickFirstChild(parent, nsuri, localName);
if(elem == null){
String message = MessageFormat.format(ERRMSG_NOELEM,
localName,
parent.getLocalName() );
throw new TogaXmlException(message);
}
return elem;
}
/**
* 指定された名前の子要素のforeachを返す。
* @param parent 親要素
* @param nsuri 名前空間URI
* @param localName 子要素名
* @return 子要素のforeach
*/
public static Iterable