• XML 解析中 SelectSingleNode 与 SelectNodes 使用通配符介绍


    俺是 XML XPath的新手,最近因为项目需要,研究了一下基本的两个函数 SelectSingleNode和SelectNodes 是如何实用通配符的,分享以下基本经验:

    假设有段XML 如下所示:

    <PageConfigs>
        <Page Name="Page1" PageMode="0">
            <Position>
                <Left>190</Left>
                <Top>0</Top>
                <Width>1920</Width>
                <Height>1080</Height>
                <ZIndex>1</ZIndex>
            </Position>        
        </Page>
        <Page Name="Page2" PageMode="0" Visible="0">
            <Position>
                <Left>180</Left>
                <Top>0</Top>
                <Width>1920</Width>
                <Height>1080</Height>
            </Position>
            <BizControl DllName="DEF" ClassName="ttt.zzz"/>
            <Animation>
                <StopAnimation>FadeOut</StopAnimation>
                <StartAnimation>FadeIn</StartAnimation>
            </Animation>
        </Page>
    </PageConfigs>

    如果我想要上述说有的参数 Left值,可以实用 SelectNodes:

    $colNodes = $objXML.documentElement.SelectNodes("//Left")
    For $colnode In $colNodes
      ConsoleWrite("From SelectNodes: " & $colNode.text & @CRLF)
    Next
    

    如果我想要 Page2 的参数Left值,可以使用 SelectSingleNode 以及 // 通配符

    $colNode2 = $objXML.documentElement.SelectSingleNode("//Page[@Name='Page2']//Left")
    ConsoleWrite("From SelectSingleNode: " & $colNode2.Text & @CRLF)
    

    当然,有更多的选择:

    $colNode2 = $objXML.documentElement.SelectSingleNode("//*[@Name='Page2']//Left")
    $colNode2 = $objXML.documentElement.SelectSingleNode("*[@Name='Page2']//Left")
    
    $colNode2 = $objXML.documentElement.SelectSingleNode("*[@Name='Page2']/*/Left")
    

    * 前面如果有 /, 那 * 只能配一个节点; 如果*前没有 /,则可以配很多节点;

    以上的通配方法,对SelectNodes也是有效的,但是有一个问题是:

    */*/Left 能够把所有的 Left 节点打印出来

    $colNodes = $objXML.documentElement.SelectNodes("*/*/Left")
    

    但是 */Left 却不行

    以下代码是错误的:

    $colNode2 = $objXML.documentElement.SelectSingleNode("*/Left")
    $colNodes = $objXML.documentElement.SelectNodes("*/Left")
    

    目前还不知道为什么会这样。

  • 相关阅读:
    《软件需求分析》阅读笔记
    03软件需求阅读笔记之一
    02软件需求阅读笔记之一
    01软件需求阅读笔记之一
    评价一下大家手头正在使用输入法或者搜索类的软件产品。
    05构建之法阅读笔记之一
    06构建之法阅读笔记之一
    03构建之法阅读笔记之一
    【秋招必备】Java中间件面试题(2021最新版)
    快手3面:说说傅里叶变换、拉普拉斯变换为什么要变换,它们之间的联系是什么!
  • 原文地址:https://www.cnblogs.com/autotest/p/3431173.html
Copyright © 2020-2023  润新知