Spring源码-xml解析


Spring使用SAX解析xml。SAX的全称是Simple APIs for XML,也即XML简单应用程序接口。与DOM不同,SAX提供的访问模式是一种顺序模式,这是一种快速读写XML数据的方式。当使用SAX分析器对XML文档进行分析时,会触发一系列事件,并激活相应的事件处理函数,应用程序通过这些事件处理函数实现对XML文档的访问,因而SAX接口也被称作事件驱动接口。

一、构建SAXParser

SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
saxParser.parse(
    new File("F://ideaProject//SeriTest//src//main//resources//user.xml"), new XmlHandle());

二、实现DefaultHandler自定义解析

点击查看代码
public class XmlHandle extends DefaultHandler {
  private User user;

  private String tag;

  public XmlHandle() {
    super();
  }

  @Override
  public void startDocument() throws SAXException {
    super.startDocument();
  }

  @Override
  public void endDocument() throws SAXException {
    super.endDocument();
  }

  @Override
  public void startElement(String uri, String localName, String qName, Attributes attributes)
      throws SAXException {
    this.tag = qName;
    if ("user".equals(qName)) {
      user = new User();
    }
    int length = attributes.getLength();
    for (int i = 0; i < length; i++) {
      String qName1 = attributes.getQName(i);
      if ("id".equals(qName1)) {
        user.setId(Long.parseLong(attributes.getValue(i)));
      }
    }
  }

  @Override
  public void endElement(String uri, String localName, String qName) throws SAXException {
    if ("user".equals(qName)) {
      System.out.println(user);
    }
  }

  @Override
  public void characters(char[] ch, int start, int length) throws SAXException {
    String s = new String(ch, start, length).trim();
    if (Objects.isNull(s) || s.length() < 1) {
      return;
    }

    if ("name".equals(tag)) {
      user.setName(s);
    } else if ("age".equals(tag)) {
      if (isPositiveInteger(s)) {
        user.setAge(Integer.parseInt(s));
      }

    } else if ("email".equals(tag)) {
      user.setEmail(s);
    }
  }

  private static boolean isMatch(String regex, String orginal) {
    if (orginal == null || orginal.trim().equals("")) {
      return false;
    }
    Pattern pattern = Pattern.compile(regex);
    Matcher isNum = pattern.matcher(orginal);
    return isNum.matches();
  }

  public static boolean isPositiveInteger(String orginal) {
    return isMatch("^//+{0,1}[1-9]//d*", orginal);
  }
}

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/281291.html

(0)
上一篇 2022年8月20日
下一篇 2022年8月20日

相关推荐

发表回复

登录后才能评论