• 不一样的味道--Html和Xml解析、格式、遍历


    很多其它内容查看官网:http://www.tinygroup.org

    TinyXmlParser一切以简单、有用、高速为主。

    演示样例1:Xml字符串解析

    比方,我们要解析一段Xml字符串,简单例如以下就可以:

    XmlDocument xmlDocument = new XmlStringParser().parse("<title><a>a</a></title>");

    演示样例2:输出格式化后的Xml:

    XmlFormater formater = new XmlFormater();
    System.out.println(formater.format(xmlDocument));

    执行结果例如以下:

    <title>
      <a>a</a>
    </title>

    当然换一种写法也是能够的。比方以下:

    XmlDocument xmlDocument = new XmlStringParser().parse("<title><a>a</a></title>");
    XmlFormater formater = new XmlFormater();
    formater.format(xmlDocument,System.out));
    输出结果和上面是一样的。

    演示样例3:中文标签支持

    XmlDocument document = new XmlStringParser().parse("<html 中='文'><head><title>aaa</title><中>中信</中></head></html>");
    document.write(System.out);
    XmlFormater formater = new XmlFormater();
    formater.format(document, System.out);

    上面的样例用了两种方式,一种是非格式化方式输出。默认是用一行输出的;还有一种是格式化输出的:

    <html 中="文"><head><title>aaa</title><中>中信</中></head></html>
    <html 中="文">
      <head>
        <title>aaa</title>
        <中>中信</中>
      </head>
    </html>

    能够看到对于中文标签及属性也有完美支持。

    演示样例4:容错性演示样例

    XmlDocument document = new XmlStringParser().parse("<title><a>a</title>");
    XmlFormater formater = new XmlFormater();
    formater.format(document, System.out);

    上面的样例中。<a> 标签没有</a>结束标签。

    输出结果例如以下:

    <title>
      <a>a</a>
    </title>

    能够看到,它已经尽最大可能来推測是否正确

    演示样例5:性能測试

    XmlNode node = null;
    
    	public NameFilterTest() {
    		node = new XmlNode("root");
    		for (int i = 0; i < 60; i++) {
    			XmlNode a = node.addNode(new XmlNode("a" + i));
    			for (int j = 0; j < 60; j++) {
    				XmlNode b = a.addNode(new XmlNode("b" + j));
    				for (int k = 0; k < 60; k++) {
    					b.addNode(new XmlNode("c" + k));
    				}
    			}
    		}
    	}

    构建这么大一棵Dom树

    long t21 = System.currentTimeMillis();
    FastNameFilter<XmlNode> fast = new FastNameFilter(node);
    long t22 = System.currentTimeMillis();
    System.out.println("初始化用时:" + (t22 - t21));
    long t1 = System.currentTimeMillis();
    for (int x = 0; x < 10000; x++) {
        XmlNode node = fast.findNode("b6");
    }
    // System.out.println(nodeName);
    long t2 = System.currentTimeMillis();
    System.out.println("遍历用时:" + (t2 - t1));

    执行结果例如以下:

    初始化用时:48
    遍历用时:20

    请注意。上面的时间单位不是分钟。不是秒钟。而是毫秒。

    演示样例6:节点过滤

    对节点过滤是否方便才是最紧要的。

    这个功能,太过强大,因此。用样例已经演示不出它的强大了。

    直接贴接口:

    public interface NodeFilter<T extends Node<T>> {
    	/**
    	 * 初始化节点
    	 * 
    	 * @param node
    	 */
    	void init(T node);
    
    	/**
    	 * 设置必须包括的属性及相应属性的值,必须存在
    	 * 
    	 * @param includeAttributes
    	 */
    	void setIncludeAttribute(Map<String, String> includeAttributes);
    
    	/**
    	 * 设置必须包括的属性及相应的属性的值。必须存在
    	 * 
    	 * @param key
    	 * @param value
    	 */
    	void setIncludeAttribute(String key, String value);
    
    	/**
    	 * 设置必须包括的属性
    	 * 
    	 * @param includeAttribute
    	 */
    	void setIncludeAttributes(String... includeAttribute);
    
    	/**
    	 * 设置必须排除的属性及相应属性值 假设包括属性,但属性的值与Map中不同样。同意存在该属性 若包括属性且属性的值与Map中同样,则不同意存在该属性
    	 * 
    	 * @param excludeAttribute
    	 */
    	void setExcludeAttribute(Map<String, String> excludeAttribute);
    
    	/**
    	 * 设置必须排除的属性。指定的属性不能存在
    	 * 
    	 * @param excludeAttribute
    	 */
    	void setExcludeAttribute(String... excludeAttribute);
    
    	/**
    	 * 设置必须包括的内容,仅仅须要context中包include该值即可
    	 * 
    	 * @param includeText
    	 */
    	void setIncludeText(String... includeText);
    
    	/**
    	 * 设置必须排除的内容
    	 * 
    	 * @param excludeText
    	 */
    	void setExcludeText(String... excludeText);
    
    	/**
    	 * 设置必须包括的子节点
    	 * 
    	 * @param includeNode
    	 */
    	void setIncludeNode(String... includeNode);
    
    	/**
    	 * 设置父节点不同意的节点名称
    	 * 
    	 * @param excludeByNode
    	 */
    
    	void setExcludeByNode(String... excludeByNode);
    
    	/**
    	 * 设置父节点必须包括的节点名称
    	 * 
    	 * @param includeByNode
    	 */
    	void setIncludeByNode(String... includeByNode);
    
    	/**
    	 * 设置必须排除的子节点
    	 * 
    	 * @param excludeNode
    	 */
    
    	void setExcludeNode(String... excludeNode);
    
    	/**
    	 * 设置至少包括一个指定名称的节点
    	 * 
    	 * @param xorSubNode
    	 */
    	void setXorSubNode(String... xorSubNode);
    
    	/**
    	 * 设置至少包括一个指定名称属性
    	 * 
    	 * @param xorProperties
    	 */
    	void setXorProperties(String... xorProperties);
    
    	/**
    	 * 清除过滤条件
    	 */
    	void clearCondition();
    
    	/**
    	 * 设置要搜索的节点名称
    	 */
    	void setNodeName(String nodeName);
    
    	/**
    	 * 查找指定节点名称及满足其它条件的节点列表
    	 * 
    	 * @param nodeName
    	 * @return
    	 */
    	List<T> findNodeList(String nodeName);
    
    	/**
    	 * 依据名字及其它条件查找节点,假设有多个,也仅仅返回第一个
    	 * 
    	 * @param nodeName
    	 *            要查找的节点名称
    	 * @return
    	 */
    	T findNode(String nodeName);
    
    	/**
    	 * 搜索符合设置的节点名称的节点,假设有多个,则仅仅返回找到的第一个
    	 * 
    	 * @return
    	 */
    	T findNode();
    
    	/**
    	 * 搜索符合设置的节点名称的节点列表
    	 * 
    	 * @return
    	 */
    	List<T> findNodeList();
    }

    也就是说它支持节点指定属性名及指定属性值过滤(能够指定多组)、指定属性名过滤(无论是什么值都能够。能够指定多个)、能够指定排除属性及属性值(即不能包括的属性名及值,能够包括多组)、不能包括的属性(能够包括多组)、包括文本内容(能够指定多组)、不能包括的文件内容(能够指定多组),能够指定包括的节点名(能够指定多组)、能够指定不能包括的节点(能够指定多组)、能够指定必须在某个节点下(能够指定多组)、能够指定不能在某个节点下(能够指定多组)、能够指定至少包括某几个节点中的一个,能够指定至下包括某几个属性中的一个,能够依据节点名进行搜索。

    上面的全部条件能够组合起来一起搜索。

    说了这么多。看看測试用例:

    node = new XmlNode("root");
    XmlNode n1 = node.addNode(new XmlNode("aa"));
    n1.setAttribute("a", "av");
    n1.setAttribute("b", "bv");
    n1.addNode(new XmlNode("a"));
    n1 = node.addNode(new XmlNode("aa"));
    n1.setAttribute("a", "av1");
    n1.setAttribute("b", "bv1");
    n1.setAttribute("c", "cv1");
    n1.addNode(new XmlNode("b"));

    上面构建了一棵Dom树:

    <root>
      <aa a="av" b="bv">
        <a>
        </a>
      </aa>
      <aa a="av1" b="bv1" c="cv1">
        <b>
        </b>
      </aa>
    </root>

    以下是一堆的測试用例了:

    filter = new NameFilter(node);
    filter.clearCondition();
    assertEquals(1, filter.findNodeList("root").size());
    filter.setExcludeAttribute("c");
    assertEquals(1, filter.findNodeList("aa").size());
    // 測试包括属性名
    filter.clearCondition();
    assertEquals(1, filter.findNodeList("root").size());
    filter.setIncludeAttributes("c");
    assertEquals(1, filter.findNodeList("aa").size());
    // 測试包括指定属性值
    filter.clearCondition();
    Hashtable<String, String> pht = new Hashtable<String, String>();
    pht.put("a", "av1");
    filter.setIncludeAttribute(pht);
    assertEquals(1, filter.findNodeList("aa").size());
    filter.setExcludeAttribute("c");
    assertEquals(0, filter.findNodeList("aa").size());
    // 測试包括指定节点
    filter.clearCondition();
    filter.setIncludeNode("a");
    assertEquals(1, filter.findNodeList("aa").size());
    filter.setIncludeAttributes("c");
    assertEquals(0, filter.findNodeList("aa").size());
    // 測试包括指定节点
    filter.clearCondition();
    filter.setExcludeNode("c");
    assertEquals(2, filter.findNodeList("aa").size());

    測试用例写得比較丑,可是对它的使用还是做了一个简单的演示。

    上面全部的样例其中,把X变成Ht,就是针对Html解析器的了,API全然一致,使用方法全然同样。

    差别在于Xml的标签及属性名是大写和小写敏感的,而Html是大写和小写不敏感的。

    其他Html支持单标签。

    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    Dubbo服务提供者Provider启动流程下(四)
    修改超链接的默认格式
    给 3Com 3C940 Gigabit LOM 安装Windows Server 2008 驱动
    Express版SQL定时备份BAK文件(SQL2005,SQL2008)
    DataGridView的行、列调整
    更新DNS缓存
    VB.Net类型转换——全角半角间转换(StrConv)
    VB.Net 获取或者转换时间不受系统时间格式影响
    Active Desktop
    VB.Net类型转换——全角半角间转换(StrConv)
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4635369.html
Copyright © 2020-2023  润新知