package tools; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathExpression; import org.w3c.dom.CharacterData; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathExpression; import javax.xml.xpath.XPathExpressionException; import javax.xml.xpath.XPathFactory; public class XMLTools { /** * Вернуть значение первой попавшийся CDATA * @return строка */ public static String getCDATAValue(Node node) { if(node==null) return ""; NodeList items = node.getChildNodes(); for (int i=0;i 0) result = nodeList.item(0); return result; } /** * Поиск среди текущего и дочерних узлов * @param {Node} node Корневой узел * @param {String} nodename Имя первого попавшегося узла * @returns {undefined} */ public static Node findFirstNode(Node node, String nodename) { Node result=null; if(node==null) return result; javax.xml.xpath.XPathFactory xPathfactory = javax.xml.xpath.XPathFactory.newInstance(); XPath xpath = xPathfactory.newXPath(); XPathExpression expr=null; Object exprResult=null; try { expr = xpath.compile("//*/"+nodename); exprResult = expr.evaluate(node, XPathConstants.NODESET); } catch (XPathExpressionException ex) { } NodeList nodeList = (NodeList) exprResult; if (nodeList.getLength() > 0) result = nodeList.item(0); return result; } /** * Присвоить дочерние узлы первого дерева второму если их нет, иначе дополнить либо заменить. (Работает через рекурсию нужно для передачи параметров между окнами) * @param {XML} first Узел где ханятся настройки * @param {XML} second Узел к которому применяются настройки * @param {String} name Имя атрибута по которому будут находиться одинаковые XML узлы * @returns {undefined} */ public static void applyNodeToNode(Node first, Node second,String name) { if(first==null || second==null || name==null) return; //Если есть совпадающие узлы то передаём в рекурсию если нет то просто копируем Node fn=first.getFirstChild(); while (fn != null) { Node sn=null; if(!fn.getNodeName().equals("#text") && !fn.getNodeName().equals("#cdata-section") && !fn.getNodeName().equals("#comment")) { //потому что для этих getAttribute вызывает ошибку sn=findNodeOnAttribute(second,fn.getNodeName(),name,fn.getAttributes().getNamedItem(name).getNodeValue()); } if(sn!=null) //Если по имени атрибуту совпали узлы { //Переписываем значения атрибутов из первого второму, если их нет то создаём. for(int i=0;i