VB.net中的System.xml.linq与system.xml.xpath

时间:2015-08-26 14:08:51

标签: xml vb.net xpath linq-to-xml

好的,所以我引用了一个命名空间,所以在使用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

Xpath OR

"//w:rPr/w:sz|w:szCs"

变为

Me...<w:rPr>.<w:sz>.Concat(Me...<w:rPr>.<w:szCs>)

XPath位置

获取所有表格第一行中所有单元格的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查询更容易,但它可能更容易维护和调试。

0 个答案:

没有答案