zoukankan      html  css  js  c++  java
  • tdom中selectNodes的使用

    tdom中selectNodes的使用

    tdom中selectNodes的使用

    我们在使用xml的时候,经常需要通过一个唯一的标识ID来进行索引。我们通过查看tdom的帮助文档,其中明确说明了,有这么一个API: getElementById ,看起来就是通过一个标识ID来进行查找的。但实际上,这个是行不通的,后来搜索了google,这个是只有在parse的时候加了-html选项的时候才有效的。而html的解析规则标准要低一些,我们不推荐用这个规则去解析xml。

    <?xml version="1.0" encoding="utf-8"?>
    <root>
      <group name="All xxx" id="#1">
        <group name="A" id="#2">
        </group>
        <group name="B" id="#3">
        </group>
        <group name="C" id="#4">
        </group>
      </group>
    </root>
    

    那么,我们怎么快速方便的通过id属性找到我们想要的node呢?

    1 递归查找

    就是每次从根节点,递归查找每个node,然后,检查其中的id属性值是否相等,相等就返回。这个对于专门查找id这种具有唯一值的属性是没有问题的,但是这种做法,效率可能不高,另外不具有灵活性,万一我只想把当前层的某个值查找出来呢?把所有的值相等的都找出来呢?

    2 使用selectNodes来进行查找

    2.1 基本语法

    selectNodes -namespaces prefixUriList -cache <boolean> xpathQuer typeVar

    Returns the result of applying the XPath query xpathQuery to the subtree. This can be a string/value, a list of strings, a list of nodes or a list of attribute name / value pairs. If typeVar is given the result type name is stored into that variable (empty, bool, number, string, nodes, attrnodes or mixed).

    中心思想就是使用其中的XPath规则来进行查找,其中的namespaces选项和cache选项还没有使用过,后面使用来再进行补充。这个XPath规则还是很有意思的,相当于我们的文件路径,这样它把查找xml中的node变为查找文件夹中的文件了。这里做个简单的类比,文件夹相当于xml中的父节点,文件夹的属性,相当于父节点中的attribute也是属性,文件夹中的文件相当于xml中的子节点(当然,这里的文件可以是文件也可以是文件夹,文件夹相当于递归下去),同样,它们也具有属性值。所以,我们可以简单的认为,其实我们的文件夹系统,抽象之后就是一个xml的。

    2.2 XPath的规则

    要使用XPath来进行查找,首先要了解XPath的使用规则:

    1. XPath和文件路径相似:也是使用 / 作为分隔符;
    2. 使用 [@attrName='attrValue'] 这种属性 名/值 对进行匹配,一定要注意其中的 '' 符号,把值包起来,否则无效;
    3. 可以使用 ... 来表示当前节点以下或者父节点一层,也和文件路径一致;
    4. 使用 // 两个 / 表示任意层级;
    5. 使用 * 作为通配符,但也只能单独使用,不能想glob命令或者正则表达式一样和其他字母组合到一起使用。

    2.3 使用范例

    1. 从根节点通过属性 名/值 查找(通过使用 //* ):

      proc ::getXmlNodeByAttr {xmlNode attrName attrValue} {
          return [$xmlNode selectNodes "//*[@$attrName='$attrValue']"]
      }
      
    2. 从根节点通过属性 名/值 查找某个tagName(文件夹名称)中的节点:

      proc getXmlNodeByTagAndAttr {xmlNode tagName attrName attrValue} {
          return [$xmlNode selectNodes "//$tagName[@$attrName='$attrValue']"]
      }
      
    3. 同理,也可以写出查找当前文件夹下的文件,当前文件夹及子文件夹中的文件类似的一系列函数,具体的实现很简单,就不一一实现了。

    Date: 2017-01-08 09:56

    Created: 2017-01-08 周日 11:39

    Validate

  • 相关阅读:
    6月11日 python学习总结 框架理论
    6月7日 python 复习 collections
    6月6日 python复习 面向对象
    6月6日 python学习总结 jQuery (三)
    6月5日 python复习 模块
    6月5日 python学习总结 jQuery (二)
    6月4日 python学习总结 装饰器复习
    Redis源码分析(五)--- sparkline微线图
    Redis源码分析(六)--- ziplist压缩列表
    Redis源码分析(六)--- ziplist压缩列表
  • 原文地址:https://www.cnblogs.com/yangwen0228/p/6261607.html
Copyright © 2011-2022 走看看