用SAX(JDK自带API)解析XML文件

用SAX(JDK自带API)解析XML文件

解析的工具类继承org.xml.sax.helpers.DefaultHandler,然后覆盖父类的几个方法即可。方法的详细解释可以参照JDK的API文档。

  • startDocument() 开始解析XML时被调用,一般可以用来做初始化操作。
  • startElement() 解析到某个元素(标签)的开头时(例如 )被调用,一般用来判断是否已开始解析某特定元素(标签)。
  • endElement() 解析完某个元素(标签)时(例如)被调用,一般在此对某些逻辑标记做重置操作。
  • characters()  解析到某个文本元素(例如 张三 )时被调用,一般在此方法中取值,需要结合startElement()方法中设置的逻辑标志进行判断是否解析到XML文档中特定的位置。

下面是一个实例:

Java代码:
  1. import java.util.ArrayList;
  2. import java.util.List;
  3. import java.io.File;
  4. import java.io.IOException;
  5. import javax.xml.parsers.ParserConfigurationException;
  6. import javax.xml.parsers.SAXParser;
  7. import javax.xml.parsers.SAXParserFactory;
  8. import org.xml.sax.Attributes;
  9. import org.xml.sax.SAXException;
  10. import org.xml.sax.helpers.DefaultHandler;
  11. public class URLPatternSAXParser extends DefaultHandler{
  12. private List  urlPatternList;
  13. private boolean isSecurityConstraint;
  14. private boolean isWebResourceCollection;
  15. private boolean isUrlPattern;
  16. private final String elementSecurityConstraint = "security-constraint";
  17. private final String elementWebResourceCollection = "web-resource-collection";
  18. private final String elementUrlPattern = "url-pattern";
  19. public List  getUrlPatternList() {
  20. return urlPatternList;
  21. }
  22. @Override
  23. public void startDocument() throws SAXException {
  24. this.urlPatternList = new ArrayList ();
  25. }
  26. //原文参考自杭州红木家具维修http://www.hzlxwx.com
  27. @Override
  28. public void startElement(String uri, String localName, String qName,
  29. Attributes attributes) throws SAXException {
  30. if (elementSecurityConstraint.equals(qName)) {
  31. isSecurityConstraint = true;
  32. return;
  33. }
  34. if (isSecurityConstraint && elementWebResourceCollection.equals(qName)) {
  35. isWebResourceCollection = true;
  36. return;
  37. }
  38. if (isSecurityConstraint && isWebResourceCollection
  39. && elementUrlPattern.equals(qName))
  40. isUrlPattern = true;
  41. }
  42. @Override
  43. public void endElement(String uri, String localName, String qName)
  44. throws SAXException {
  45. if (elementSecurityConstraint.equals(qName)) {
  46. isSecurityConstraint = false;
  47. }
  48. if (elementWebResourceCollection.equals(qName))
  49. isWebResourceCollection = false;
  50. if (elementUrlPattern.equals(qName))
  51. isUrlPattern = false;
  52. }
  53. @Override
  54. public void characters(char[] ch, int start, int length)
  55. throws SAXException {
  56. if (isSecurityConstraint && isWebResourceCollection && isUrlPattern) {
  57. this.urlPatternList.add(new String(ch, start, length));
  58. }
  59. }
  60. public void parser(File xmlFile) throws SAXException, IOException,
  61. ParserConfigurationException {
  62. if (xmlFile == null) {
  63. throw new IllegalArgumentException(
  64. "parameter 'xmlFile' must not null !");
  65. }
  66. SAXParserFactory factory = SAXParserFactory.newInstance();
  67. SAXParser parser = factory.newSAXParser();
  68. // 禁止DTD解析,避免因找不到DTD文件导致解析失败。
  69. parser.getXMLReader()
  70. .setFeature(
  71. "http://apache.org/xml/features/nonvalidating/load-external-dtd",
  72. false);
  73. try {
  74. parser.parse(xmlFile, this);
  75. catch (SAXException e) {
  76. System.err.println("Cann't parse " + xmlFile.getAbsolutePath());
  77. throw e;
  78. }
  79. }
  80. }

上面代码中,parser()是主方法,调用完此方法之后,就可以调用getUrlPatternList()方法获取到从web.xml中解析出来的url-pattern节点的值(security-constraint/web-resource-collection/url-pattern)。


另外,取元素的属性值,可以在startElement()方法中用attributes.getValue("<属性名>")获取到。


你可能感兴趣的:(用SAX(JDK自带API)解析XML文件)