好的,所以我引用了一个命名空间,所以在使用linq to xml时我不需要提供那个上下文
Imports <xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
所以我可以通过例如以下查询
来获取文档中的节点列表For Each nd In Me.CurrentDocument...<w:pPr>.<w:spacing>
Next
但是现在我有一个非常复杂的xpath,我想用或者执行,例如
"//w:rPr/w:sz|w:szCs[@w:val]"
我可以引用system.xml.xpath来公开XPPathSelectElements选项,但每次都必须传递命名空间。
For Each nd In Me.CurrentDocument.XPathSelectElements(
"//w:rPr/w:sz|w:szCs[@w:val]", NameSpaceManager)
nd.@w:val = "16"
Next
我不能将此设为默认值吗?或者我是否必须设置命名空间管理器并在每次我想在xpath上查询时使用它?
或者,我是否可以使用xq和(|)使用linq to xml和vb简写表示法执行相同的查询?
更新
我越是处理这个问题,我就越发现我可以在不使用XPath查询的情况下完成所有工作。
这里有一篇很好的文章可以解释很多不同之处:https://msdn.microsoft.com/en-us/library/bb675156.aspx
"//w:rPr/w:sz|w:szCs"
变为
Me...<w:rPr>.<w:sz>.Concat(Me...<w:rPr>.<w:szCs>)
获取所有表格第一行中所有单元格的Xpath:
"//w:tbl/w:tr[1]/w:tc"
变为
Me...<w:tbl>.SelectMany(Function(a) a.<w:tr>.Take(1).<w:tc>)
如果没有SelectMany,您只需获得第一个表的第一行中的第一个单元格:
Me...<w:tbl>.<w:tr>.Take(1).<w:tc>
因此,事实证明你可以做几乎所有XPath可以做的事情,你确实得到了一些智能感知,但我个人认为它写起来并不一定比xpath查询更容易,但它可能更容易维护和调试。