/** * Search specific element by key and tagName. * * @param root root element * @param key search keyword * @param tagName search tag name * @return search result, null of either input is invalid or the looking result is not found. */ private Element searchForKey(final Element root, final String key, final String tagName) { if (root == null || StringUtils.isEmptyString(key)) { return null; } final Queue<Element> queue = new LinkedList<>(); queue.offer(root); while (!queue.isEmpty()) { final Element pe = queue.poll(); final NodeList pchildrenList = pe.getChildNodes(); for (int i = 0; i < pchildrenList.getLength(); i++) { final Node node = pchildrenList.item(i); if (node.getNodeType() == Node.ELEMENT_NODE) { queue.offer((Element) node); } } String value = pe.getNodeName(); if (StringUtils.isEmptyString(value) || !value.equals(tagName)) { continue; } value = pe.getAttribute(ATTRIBUTE_NAME_NAME); if (StringUtils.isEmptyString(value)) { continue; } if (value.equals(key)) { return pe; } } return null; }
@SuppressWarnings("unchecked") public static String append(Document document, String xpath, String xml) { String namespace = document.getRootElement().getNamespaceURI(); if (!StringUtils.isEmptyString(xpath) && !StringUtils.isEmptyString(xml)) { ((Element) document.selectSingleNode(xpath)) .elements() .addAll(getElementListFromXMl(xml, namespace)); } else { document.getRootElement().elements().addAll(getElementListFromXMl(xml, namespace)); } return document.asXML(); }
/** * 根据xpath获得指定document对象节点的属性的值 * * @param document 待解析的document对象 * @param xpath 节点XPath * @return 指定节点属性的值列表 */ public static List<String> getNodeAttributeValue(Document document, String xpath) { List<String> result = null; // 进行命名空间处理 if (!StringUtils.isEmptyString(document.getRootElement().getNamespaceURI())) { // 将xpath中增加命名空间 xpath = xpath.replaceAll(XPATH_NAMESPACE_REGEX, XPATH_REPLACE_NAMESPACE); } List nodeList = document.selectNodes(xpath); if (nodeList != null && nodeList.size() > 0) { result = new ArrayList<String>(); int begin = xpath.lastIndexOf("@"); int end = xpath.indexOf("]", begin + 1); if (begin == -1 || end == -1) { throw new IllegalArgumentException("no attribute has be assigned in xpath!"); } String attrName = xpath.substring(begin, end); for (Object obj : nodeList) { Node attr = (Node) obj; result.add(attr.valueOf(attrName)); } } return result; }
/** * 根据xml文件对象获得其Document对象 * * @param xmlFile 待解析的XML文件对象 * @return document对象 * @throws IOException */ public static Document getDocumentFromFile(File xmlFile) throws IOException { if (!xmlFile.exists()) { throw new FileNotFoundException("file " + xmlFile + " does not exist!"); } else if (xmlFile.isDirectory()) { throw new IOException("file " + xmlFile + " exists but is a directory!"); } else if (xmlFile.canRead() == false) { throw new IOException("file " + xmlFile + " cannot be read!"); } Document document = null; SAXReader saxReader = new SAXReader(); try { setReaderValidation(saxReader); document = saxReader.read(xmlFile); String namespace_uri = document.getRootElement().getNamespaceURI(); if (!StringUtils.isEmptyString(namespace_uri)) { setReadernameSpace(saxReader, namespace_uri); } } catch (DocumentException e) { e.printStackTrace(); } return document; }
/** * 向xml文档对象指定位置前面插入xml * * @param document xml文档对象 * @param xpath 位置xpath * @param xml 插入内容 * @return xml文档最终内容字符串 */ @SuppressWarnings("unchecked") public static String insertBefore(Document document, String xpath, String xml) { String namespace = document.getRootElement().getNamespaceURI(); if (!StringUtils.isEmptyString(xpath) && !StringUtils.isEmptyString(xml)) { List<Element> list = ((Element) document.selectSingleNode(xpath)).getParent().elements(); for (int j = 0; j < list.size(); j++) { if (list.get(j).matches(xpath)) { list.addAll(j, getElementListFromXMl(xml, namespace)); break; } } } else { document.getRootElement().elements().addAll(0, getElementListFromXMl(xml, namespace)); } return document.asXML(); }
public static String setXPathNamespace(Element ele, String xpath) { // 进行命名空间处理 if (!StringUtils.isEmptyString(ele.getNamespaceURI())) { // 将xpath中增加命名空间 xpath = xpath.replaceAll(XPATH_NAMESPACE_REGEX, XPATH_REPLACE_NAMESPACE); } return xpath; }
/** * 根据输入流InputStream获取XML文件Document对象 <br> * 注意:XMLUtils不会关闭 InputStream,请自己手工关闭,避免输入流泄流。 * * @param inputStream xml文档输入流 * @return XML Document对象 */ public static Document getDocumentFromStream(InputStream inputStream) { InputStreamReader isr = null; BufferedReader br = null; SAXReader saxReader = new SAXReader(); Document document = null; try { isr = new InputStreamReader(inputStream, "UTF-8"); br = new BufferedReader(isr, 1024); setReaderValidation(saxReader); document = saxReader.read(br); String namespace_uri = document.getRootElement().getNamespaceURI(); if (!StringUtils.isEmptyString(namespace_uri)) { setReadernameSpace(saxReader, namespace_uri); } } catch (DocumentException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } finally { if (br != null) { try { br.close(); } catch (IOException e) { e.printStackTrace(); } br = null; } if (isr != null) { try { isr.close(); } catch (IOException e) { e.printStackTrace(); } isr = null; } } return document; }
/** * 从jar包中加载xml文件为document对象<br> * 该方法优先从classpath进行加载,如果没有找到,再通过classloader从jar包中进行加载 * * @param loader 指定jar包中类的类加载器 * @param path xml文件在jar包中的相对位置 * @return Document对象 */ public static Document getDocumentFromJar(ClassLoader loader, String path) { Document document = getDocumentFromClasspath(path); if (document == null && loader != null) { SAXReader saxReader = new SAXReader(); InputStream is = loader.getResourceAsStream(path); try { setReaderValidation(saxReader); document = saxReader.read(is); String namespace_uri = document.getRootElement().getNamespaceURI(); if (!StringUtils.isEmptyString(namespace_uri)) { setReadernameSpace(saxReader, namespace_uri); } } catch (DocumentException e) { e.printStackTrace(); } } return document; }
/** * 根据xml字符串获得Element元素列表 * * @param xml xml字符串 * @param namespace 命名空间 * @return Element列表 */ @SuppressWarnings("unchecked") private static List<Element> getElementListFromXMl(String xml, String namespace) { String root = RandomUtils.randomString(5); xml = "<_" + root + (StringUtils.isEmptyString(namespace) ? "" : " xmlns=\"" + namespace + "\"") + ">" + xml + "</_" + root + ">"; List<Element> result = new ArrayList<Element>(); List<Element> elementList = getDocumentFromString(xml).getRootElement().elements(); for (int i = 0; i < elementList.size(); i++) { result.add(elementList.get(i).createCopy()); } return result; }
/** * 将指定的xml格式字符串转换为Document对象,使用UTF-8编码 * * @param xmlContent 待解析的XML字符串 * @return document对象 */ public static Document getDocumentFromString(String xmlContent) { SAXReader saxReader = new SAXReader(); Document document = null; try { setReaderValidation(saxReader); document = saxReader.read(new ByteArrayInputStream(xmlContent.getBytes("UTF-8"))); String namespace_uri = document.getRootElement().getNamespaceURI(); if (!StringUtils.isEmptyString(namespace_uri)) { setReadernameSpace(saxReader, namespace_uri); } } catch (DocumentException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return document; }
/** * 根据xpath路径获得指定的节点信息列表 <br> * 列表中每一个Map代表一个节点,key为节点的属性名称,value为对应属性的值 <br> * <br> * <b>key统一为小写</b><br> * <br> * key为<b>node_name</b>表示该节点的名称<br> * key为<b>node_value</b>表示该节点的值 * * @param document 待解析的文档对象 * @param xpath 节点路径 * @return 节点列表 */ public static List<Map<String, String>> getNodeInfoList(Document document, String xpath) { List<Map<String, String>> result = null; // 进行命名空间处理 if (!StringUtils.isEmptyString(document.getRootElement().getNamespaceURI())) { // 将xpath中增加命名空间 xpath = xpath.replaceAll(XPATH_NAMESPACE_REGEX, XPATH_REPLACE_NAMESPACE); } List list = document.selectNodes(xpath); if (list != null && list.size() > 0) { result = new ArrayList<Map<String, String>>(); for (Object obj : list) { Element element = (Element) obj; Map<String, String> map = new HashMap<String, String>(); map.put("node_name", element.getName()); // 节点名称 map.put("node_value", element.getText()); // 节点值 List attrList = element.attributes(); if (attrList != null && attrList.size() > 0) { for (Object o : attrList) { Node attr = (Node) o; map.put(attr.getName().toLowerCase(), attr.getText()); } } result.add(map); } } return result; }
/** * 获得指定节点的值列表 * * @param document 待解析的document对象 * @param xpath 节点XPath * @return 节点值列表 */ public static List<String> getNodeValue(Document document, String xpath) { List<String> result = null; // 进行命名空间处理 if (!StringUtils.isEmptyString(document.getRootElement().getNamespaceURI())) { // 将xpath中增加命名空间 xpath = xpath.replaceAll(XPATH_NAMESPACE_REGEX, XPATH_REPLACE_NAMESPACE); } List nodeList = document.selectNodes(xpath); if (nodeList != null && nodeList.size() > 0) { result = new ArrayList<String>(); for (Object obj : nodeList) { Node node = (Node) obj; result.add(node.getText()); } } return result; }