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

原文地址:https://www.cnblogs.com/yangwen0228/p/6261607.html