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:
1 2 3 4 | $colNodes = $objXML.documentElement.SelectNodes( "//Left" ) For $colnode In $colNodes ConsoleWrite( "From SelectNodes: " & $colNode.text & @CRLF) Next |
如果我想要 Page2 的参数Left值,可以使用 SelectSingleNode 以及 // 通配符
1 2 | $colNode2 = $objXML.documentElement.SelectSingleNode( "//Page[@Name='Page2']//Left" ) ConsoleWrite( "From SelectSingleNode: " & $colNode2.Text & @CRLF) |
当然,有更多的选择:
1 | $colNode2 = $objXML.documentElement.SelectSingleNode( "//*[@Name='Page2']//Left" ) |
1 | $colNode2 = $objXML.documentElement.SelectSingleNode( "*[@Name='Page2']//Left" ) |
1 | $colNode2 = $objXML.documentElement.SelectSingleNode( "*[@Name='Page2']/*/Left" ) |
* 前面如果有 /, 那 * 只能配一个节点; 如果*前没有 /,则可以配很多节点;
以上的通配方法,对SelectNodes也是有效的,但是有一个问题是:
*/*/Left 能够把所有的 Left 节点打印出来
1 | $colNodes = $objXML.documentElement.SelectNodes( "*/*/Left" ) |
但是 */Left 却不行
以下代码是错误的:
1 2 | $colNode2 = $objXML.documentElement.SelectSingleNode( "*/Left" ) $colNodes = $objXML.documentElement.SelectNodes( "*/Left" ) |
目前还不知道为什么会这样。
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步