如何使用带x命名空间的XPath选取Textbox节点下的首个Value节点
问题原因
你之前的写法存在两处错误:
- 语法错误:
[1]放在了XPath字符串外部,属于C#的字符串索引操作,完全没有作用到XPath查询逻辑中。 - XPath逻辑错误:如果直接把
[1]写为//x:Textbox[contains(@Name, 'Report_')]//x:Value[1],XPath会匹配每个父节点下的第一个Value,你的XML中每个TextRun节点下只有一个Value,所有Value都会满足[1]的筛选条件,还是会返回全部结果。
正确写法
写法1(适配你当前的XML层级结构)
你的XML中Value节点固定是TextRun的子节点,直接取每个Textbox下第一个TextRun的Value即可:
XmlNodeList changeValues = doc.SelectNodes("//x:Textbox[contains(@Name, 'Report_')]/x:TextRun[1]/x:Value", xmlnsManager);
写法2(不依赖固定层级,通用场景)
如果Value节点可能嵌套在Textbox下的任意层级,用descendant轴筛选每个Textbox下的第一个Value节点:
XmlNodeList changeValues = doc.SelectNodes("//x:Textbox[contains(@Name, 'Report_')]/descendant::x:Value[1]", xmlnsManager);
两种写法都会保留x命名空间前缀,最终只返回每个符合条件的Textbox下的第一个Value节点,也就是你需要的Banana、Apple两个值。
内容的提问来源于stack exchange,提问作者DooDooDoo2
相关产品推荐
相关产品推荐

