文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

XMLSearchUnit类怎么定义

2024-04-02 19:55

关注

这篇“XMLSearchUnit类怎么定义”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“XMLSearchUnit类怎么定义”文章吧。

首先定义XMLSearchUnit类,这个类的实例用来描述一个需要在XML中搜索的值,值可以是xml节点的值,或者是节点的属性。

package com.deepnighttwo.resourceresolver.douban.resolver.utils;   import java.util.HashMap;  import java.util.Map;   import org.xml.sax.Attributes;     public class XMLSearchUnit {       // attribute values to be matched during search      private Map<String, String> attributeMatchValidation = new HashMap<String, String>();       // if target is an attribute, then set this member to be the attribute name.      // if it is null or empty, then means the target is node value.      private String expectedAttr;       // xml path, format is: /node_name/node_name/...      private String xmlPath;       public XMLSearchUnit(String xmlPath) {          this.xmlPath = xmlPath;      }             public boolean match(String path, Attributes attributes) {          if (xmlPath.equals(path) == false) {              return false;          }           for (String key : attributeMatchValidation.keySet()) {              String exp = attributeMatchValidation.get(key);              String compare = attributes.getValue(key);              if (exp.equalsIgnoreCase(compare) == false) {                  return false;              }          }          return true;      }       public Map<String, String> getAttributeMatchValidation() {          return attributeMatchValidation;      }       public void addAttributeValidation(String key, String value) {          attributeMatchValidation.put(key, value);      }       public String getXmlPath() {          return xmlPath;      }       public void setAttributeMatchValidation(              Map<String, String> attributeMatchValidation) {          this.attributeMatchValidation = attributeMatchValidation;      }       public String getExpectedAttr() {          return expectedAttr;      }             public void setExpectedAttr(String expectedAttr) {          this.expectedAttr = expectedAttr;      }             @Override      public int hashCode() {          final int prime = 31;          int result = 1;          result = prime                 * result                  + ((attributeMatchValidation == null) ? 0                          : attributeMatchValidation.hashCode());          result = prime * result                  + ((expectedAttr == null) ? 0 : expectedAttr.hashCode());          result = prime * result + ((xmlPath == null) ? 0 : xmlPath.hashCode());          return result;      }       @Override      public boolean equals(Object obj) {          if (this == obj)              return true;          if (obj == null)              return false;          if (getClass() != obj.getClass())              return false;          XMLSearchUnit other = (XMLSearchUnit) obj;          if (attributeMatchValidation == null) {              if (other.attributeMatchValidation != null)                  return false;          } else if (!attributeMatchValidation                  .equals(other.attributeMatchValidation))              return false;          if (expectedAttr == null) {              if (other.expectedAttr != null)                  return false;          } else if (!expectedAttr.equals(other.expectedAttr))              return false;          if (xmlPath == null) {              if (other.xmlPath != null)                  return false;          } else if (!xmlPath.equals(other.xmlPath))              return false;          return true;      }   }

这个类比较简单。就是用一个hashmap保待匹配的attribut键值对,用一个字符串表示期待的attribute name,用一个字符串表示期待的node path。

然后就是如何在SAXP里用到这个类的实例去搜索了。

package com.deepnighttwo.resourceresolver.douban.resolver.utils;   import java.io.InputStream;  import java.util.ArrayList;  import java.util.HashMap;  import java.util.List;  import java.util.Map;   import javax.xml.parsers.SAXParser;  import javax.xml.parsers.SAXParserFactory;   import org.xml.sax.Attributes;  import org.xml.sax.InputSource;  import org.xml.sax.SAXException;  import org.xml.sax.XMLReader;  import org.xml.sax.helpers.DefaultHandler;      public class DoubanSearchParser extends DefaultHandler {       // create and initial search units      public static final XMLSearchUnit DETAILS_LINK_API_PATH = new XMLSearchUnit(              "/feed/entry/id");       public static final XMLSearchUnit DETAILS_CONTENT_PATH = new XMLSearchUnit(              "/entry/summary");       public static final XMLSearchUnit DETAILS_TITLE_PATH = new XMLSearchUnit(              "/entry/title");       public static final XMLSearchUnit DETAILS_CHINESE_NAME_PATH = new XMLSearchUnit(              "/entry/db:attribute");       public static final XMLSearchUnit DETAILS_RATINGE_PATH = new XMLSearchUnit(              "/entry/gd:rating");       public static final XMLSearchUnit DETAILS_RATINGE_RATER_COUNT_PATH = new XMLSearchUnit(              "/entry/gd:rating");       public static final XMLSearchUnit DETAILS_LINK_URL_PATH = new XMLSearchUnit(              "/feed/entry/link");       static {          DETAILS_LINK_URL_PATH.addAttributeValidation("rel", "alternate");          DETAILS_LINK_URL_PATH.setExpectedAttr("href");           DETAILS_CHINESE_NAME_PATH.addAttributeValidation("lang", "zh_CN");          DETAILS_CHINESE_NAME_PATH.addAttributeValidation("name", "aka");           DETAILS_RATINGE_PATH.setExpectedAttr("average");           DETAILS_RATINGE_RATER_COUNT_PATH.setExpectedAttr("numRaters");       }       // a map to store the XMLSearchUnit and value      private Map<XMLSearchUnit, String> results = new HashMap<XMLSearchUnit, String>();       // a counter of search unit. if it is 0, then all search unit finds a match      // value and the result of the XML will be skipped.      private int count = 0;       private StringBuilder path = new StringBuilder();       private static final String pathSeparater = "/";       private XMLSearchUnit[] searchUnits;       List<XMLSearchUnit> foundItems = new ArrayList<XMLSearchUnit>();             public Map<XMLSearchUnit, String> parseResults(InputStream input,              XMLSearchUnit... expectedPath) {          for (XMLSearchUnit search : expectedPath) {              results.put(search, null);          }           searchUnits = expectedPath;           count = expectedPath.length;           XMLReader xmlReader = null;          try {              SAXParserFactory spfactory = SAXParserFactory.newInstance();              spfactory.setValidating(false);              SAXParser saxParser = spfactory.newSAXParser();              xmlReader = saxParser.getXMLReader();              xmlReader.setContentHandler(this);              xmlReader.parse(new InputSource(input));          } catch (Exception e) {              System.err.println(e);              System.exit(1);          }          return results;      }       private void addToPath(String addPath) {          path.append(pathSeparater).append(addPath.toLowerCase());      }       private void popPath() {          int index = path.lastIndexOf(pathSeparater);          // String removedPath = path.substring(index);          path.delete(index, path.length());      }       @Override      public void startElement(String uri, String localName, String qName,              Attributes attributes) throws SAXException {          foundItems.clear();          if (count == 0) {              return;          }           // update path          addToPath(qName);           List<XMLSearchUnit> foundAttrItems = null;           // check if current node matches search units. if it is a node value          // search, then store it in a member variable named foundItems because          // the value of the node is known only when reaches the end of the          // node.but for attribute search, it value is known here. So then are          // put in a local variable list named foundAttrItems.          for (XMLSearchUnit unit : searchUnits) {              if (unit.match(path.toString(), attributes) == true) {                   if (unit.getExpectedAttr() == null) {                      foundItems.add(unit);                  } else {                      if (foundAttrItems == null) {                          foundAttrItems = new ArrayList<XMLSearchUnit>();                      }                      foundAttrItems.add(unit);                  }              }          }          // if no attribute match, return.          if (foundAttrItems == null) {              return;          }           // fill search unit value using attribute value. update count.          for (XMLSearchUnit attrUnit : foundAttrItems) {              String attrValue = attributes.getValue(attrUnit.getExpectedAttr());              if (results.get(attrUnit) == null) {                  count--;              }              results.put(attrUnit, attrValue);              count--;          }      }             @Override      public void characters(char[] ch, int start, int length)              throws SAXException {          if (count == 0) {              return;          }          if (foundItems.size() == 0) {              return;          }           for (XMLSearchUnit unit : foundItems) {              String content = new String(ch, start, length);              if (results.get(unit) == null) {                  count--;              }              results.put(unit, content);          }      }       @Override      public void endElement(String uri, String localName, String qName)              throws SAXException {          foundItems.clear();          if (count == 0) {              return;          }          popPath();      }  }

以上就是关于“XMLSearchUnit类怎么定义”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-前端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯