From 051b69657f78aab4aa8576e85d6347f6cec04a41 Mon Sep 17 00:00:00 2001 From: Igor I Date: Wed, 5 Feb 2025 09:40:38 +0500 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=BC=D0=B5=D1=81?= =?UTF-8?q?=D1=82=D0=B8=D0=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DBTools.java => dbtools/DBTools.java | 0 xmltools/XMLIO.java | 47 ++++++ XMLTools.java => xmltools/XMLTools.java | 199 +++++++++++++++++++++--- 3 files changed, 224 insertions(+), 22 deletions(-) rename DBTools.java => dbtools/DBTools.java (100%) create mode 100644 xmltools/XMLIO.java rename XMLTools.java => xmltools/XMLTools.java (56%) diff --git a/DBTools.java b/dbtools/DBTools.java similarity index 100% rename from DBTools.java rename to dbtools/DBTools.java diff --git a/xmltools/XMLIO.java b/xmltools/XMLIO.java new file mode 100644 index 0000000..9599869 --- /dev/null +++ b/xmltools/XMLIO.java @@ -0,0 +1,47 @@ +package tools.xml; + +import org.w3c.dom.Document; +import org.xml.sax.SAXException; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.transform.TransformerException; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.stream.StreamResult; +import javax.xml.transform.dom.DOMSource; +import java.io.*; + +/** + * Created by IntelliJ IDEA. + * User: Igor + * Date: 18.12.2005 + * Time: 15:27:36 + * To change this template use File | Settings | File Templates. + */ +public class XMLIO +{ + public static Document newDocument() throws ParserConfigurationException + { + return DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument(); + } + + public static Document load(InputStream is) throws ParserConfigurationException, IOException, SAXException + { + return DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(is); + } + + public static Document load(String filename) throws ParserConfigurationException, IOException, SAXException + { + return DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new File(filename)); + } + + public static void save(String filename, Document document) throws TransformerException, FileNotFoundException + { + save(new FileOutputStream(filename), document); + } + + public static void save(OutputStream out, Document document) throws TransformerException + { + TransformerFactory.newInstance().newTransformer().transform(new DOMSource(document), new StreamResult(out)); + } +} diff --git a/XMLTools.java b/xmltools/XMLTools.java similarity index 56% rename from XMLTools.java rename to xmltools/XMLTools.java index e7ae2f7..6cd05fa 100644 --- a/XMLTools.java +++ b/xmltools/XMLTools.java @@ -1,5 +1,6 @@ -package tools; +package tools.xml; +import javax.xml.parsers.ParserConfigurationException; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathExpression; @@ -9,14 +10,27 @@ import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; +import org.w3c.dom.ls.DOMImplementationLS; +import org.w3c.dom.ls.LSSerializer; +import org.xml.sax.SAXException; 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; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; -public class XMLTools +/** + * Created by IntelliJ IDEA. + * User: Igor + * Date: 18.12.2005 + * Time: 15:26:59 + * To change this template use File | Settings | File Templates. + */ +public class XMLTools { /** * Вернуть значение первой попавшийся CDATA @@ -35,6 +49,44 @@ public class XMLTools return ""; } + public static Document parse(String xmlString) throws IOException, ParserConfigurationException, SAXException + { + return XMLIO.load(new ByteArrayInputStream(xmlString.getBytes())); + } + + public static Document parse(InputStream xmlString) throws IOException, ParserConfigurationException, SAXException + { + return XMLIO.load(xmlString); + } + + /** + * Возвращает вложенный элемент "childName" элемента "parent"
+ * <element><childName/></element> + * @param parent + * @param childName + * @return Дочерный элемент либо null, если элементов с таким именем нет + */ + public static Element getChild(Element parent, String childName){ + NodeList nl = parent.getChildNodes(); + for (int i = 0; i node элементом (instanceOf {@link Element}) + * и имеет ли имя "tagname" + * @param node + * @param tagname + * @return + */ + public static boolean isElement(Node node, String tagname){ + return node instanceof Element && node.getNodeName().equals(tagname); + } + /** Найти узел по атрибуту */ public static Node findNodeOnAttribute(Node node, String nodename, String attribute, String val) @@ -52,26 +104,71 @@ public class XMLTools } return null; } - - public static Node findFirstNodeOnAttribute(Node node, String nodename,String attribute,String val) - { - 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+"[@"+attribute+"='" + val + "']"); - exprResult = expr.evaluate(node, XPathConstants.NODESET); - } catch (XPathExpressionException ex) { - + + //вернуть первый попавшийся узел среди дочерних + public static Node getFirstNodeOnName(Node node,String nodename) + { + Node[] mas=new Node[50]; //depth + int pos=0; + mas[pos] = node.getFirstChild(); + while (mas[pos] != null) + { + if(mas[pos].getNodeName().equals(nodename)) + { + return mas[pos]; + } + if(mas[pos].getFirstChild()!=null) + { + pos++; + mas[pos]=mas[pos-1].getFirstChild(); + }else + { + //если не идёт дальше пытаемся подняться в верх по дереву + while (true) + { + mas[pos] = mas[pos].getNextSibling(); + if (mas[pos]==null) + { + if(pos>0){ pos--; }else{ break; } + }else + { + break; + } + } + } + } + return null; + } + + /** + * Return first from childs in first deep level on name + * @param node Find in + * @param nodename Name node + * @return node + */ + public static Node getNodeOnName(Node node,String nodename) + { + if(node==null) return null; + Node nextNode = node.getFirstChild(); + while(nextNode != null) + { + if(nextNode.getNodeName().equals(nodename)) return nextNode; + nextNode=nextNode.getNextSibling(); } - NodeList nodeList = (NodeList) exprResult; - if (nodeList.getLength() > 0) - result = nodeList.item(0); - return result; - } + return null; + } + + //Сериализовать узел в строку + public static String getOuterXML(Node node) + { + DOMImplementationLS domImplementation = (DOMImplementationLS) node.getOwnerDocument().getImplementation(); + LSSerializer lsSerializer = domImplementation.createLSSerializer(); + if (!(node instanceof Document)) + { + lsSerializer.getDomConfig().setParameter("xml-declaration", false); + } + return lsSerializer.writeToString(node); + } /** * Поиск среди текущего и дочерних узлов @@ -98,7 +195,65 @@ public class XMLTools result = nodeList.item(0); return result; } - + + /** + * Найти узел по имени + * @param node + * @param nodename + * @return + */ + public static Node findFirstNode_v2(Node node, String nodename) + { + if(node==null || nodename==null) return null; + NodeList items = node.getChildNodes(); + for (int i=0;i 0) + result = nodeList.item(0); + return result; + } + /** * Присвоить дочерние узлы первого дерева второму если их нет, иначе дополнить либо заменить. (Работает через рекурсию нужно для передачи параметров между окнами) * @param {XML} first Узел где ханятся настройки