001package gudusoft.gsqlparser.dlineage.graph.utils; 002 003import gudusoft.gsqlparser.util.Logger; 004import gudusoft.gsqlparser.util.LoggerFactory; 005import org.w3c.dom.Document; 006import org.w3c.dom.Element; 007import org.w3c.dom.Node; 008import org.w3c.dom.NodeList; 009import org.xml.sax.InputSource; 010 011import javax.xml.parsers.DocumentBuilder; 012import javax.xml.parsers.DocumentBuilderFactory; 013import javax.xml.transform.Transformer; 014import javax.xml.transform.TransformerFactory; 015import javax.xml.transform.dom.DOMSource; 016import javax.xml.transform.stream.StreamResult; 017import java.io.StringReader; 018import java.io.StringWriter; 019 020public class XMLUtil { 021 private static final Logger logger = LoggerFactory.getLogger(XMLUtil.class); 022 private static final TransformerFactory transformerFactory = TransformerFactory.newInstance(); 023 024 public static Document parseXmlString(String xmlString) { 025 try (StringReader stringReader = new StringReader(xmlString.replaceAll("<data key=\"d\\d+\"/>", ""))) { 026 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 027 DocumentBuilder builder = factory.newDocumentBuilder(); 028 return builder.parse(new InputSource(stringReader)); 029 } catch (Exception e) { 030 logger.error("parse xml string failed.", e); 031 return null; 032 } 033 } 034 035 public static boolean containsNode(Document document, String nodeName) { 036 if (document != null && nodeName != null) { 037 Element rootElement = document.getDocumentElement(); 038 return containsNodeInElement(rootElement, nodeName); 039 } 040 return false; 041 } 042 043 private static boolean containsNodeInElement(Element element, String nodeName) { 044 if (element.getNodeName().equals(nodeName)) { 045 return true; 046 } 047 048 NodeList childNodes = element.getChildNodes(); 049 for (int i = 0; i < childNodes.getLength(); i++) { 050 Node node = childNodes.item(i); 051 if (node.getNodeType() == Node.ELEMENT_NODE) { 052 if (containsNodeInElement((Element) node, nodeName)) { 053 return true; 054 } 055 } 056 } 057 return false; 058 } 059 060 public static String documentToString(Document document) { 061 try (StringWriter writer = new StringWriter()) { 062 Transformer transformer = transformerFactory.newTransformer(); 063 transformer.transform(new DOMSource(document), new StreamResult(writer)); 064 return writer.toString(); 065 } catch (Exception e) { 066 logger.error("convert document to xml string failed.", e); 067 return null; 068 } 069 } 070 071 public static boolean containsText(Document document, String searchText) { 072 if (document != null && searchText != null) { 073 String documentString = documentToString(document); 074 return documentString != null && documentString.contains(searchText); 075 } 076 return false; 077 } 078 079 public static String getFirstNodeLabelTextRecursive(Node node) { 080 if (node != null && node.getNodeType() == Node.ELEMENT_NODE) { 081 Element element = (Element) node; 082 NodeList nodeList = element.getElementsByTagName("NodeLabel"); 083 084 if (nodeList.getLength() > 0) { 085 Node firstNodeLabel = nodeList.item(0); 086 return firstNodeLabel.getTextContent().trim(); 087 } 088 089 NodeList childNodes = element.getChildNodes(); 090 for (int i = 0; i < childNodes.getLength(); i++) { 091 String childNodeLabelText = getFirstNodeLabelTextRecursive(childNodes.item(i)); 092 if (childNodeLabelText != null) { 093 return childNodeLabelText; 094 } 095 } 096 } 097 return null; 098 } 099}