Ejemplo n.º 1
0
  /**
   * 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;
  }
Ejemplo n.º 2
0
  @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();
  }
Ejemplo n.º 3
0
  /**
   * 根据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;
  }
Ejemplo n.º 4
0
  /**
   * 根据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;
  }
Ejemplo n.º 5
0
  /**
   * 向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();
  }
Ejemplo n.º 6
0
  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;
  }
Ejemplo n.º 7
0
  /**
   * 根据输入流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;
  }
Ejemplo n.º 8
0
  /**
   * 从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;
  }
Ejemplo n.º 9
0
  /**
   * 根据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;
  }
Ejemplo n.º 10
0
  /**
   * 将指定的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;
  }
Ejemplo n.º 11
0
  /**
   * 根据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;
  }
Ejemplo n.º 12
0
  /**
   * 获得指定节点的值列表
   *
   * @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;
  }