如何从所选节点抓取内部文本到下一节点

时间:2013-11-16 15:33:13

标签: c# vb.net xpath

在C#/ VB中,我想使用xpath,我想从inner.Text收集w:fldChar[@fldCharType='begin']到下一个w:fldChar

我的XML是

<w:r>
  <w:fldChar w:fldCharType="begin"/>
</w:r>
<w:r>
  <w:instrText xml:space="preserve">GUID=01f8513e-c4e1-41c2-9c7b-0c9a8be5f9e6
  </w:instrText>
</w:r>
<w:r>
  <w:fldChar w:fldCharType="end"/>
</w:r>

<w:r w:rsidDel="001447B3">
  <w:fldChar w:fldCharType="begin"/>
</w:r>
<w:r w:rsidDel="001447B3">
   <w:delInstrText xml:space="preserve"> HYPERLINK "</w:delInstrText>
</w:r>
<w:r w:rsidRPr="00B0540E" w:rsidDel="001447B3">
  <w:delInstrText xml:space="preserve"> SummaryOfTable_200</w:delInstrText>
</w:r>
<w:r w:rsidDel="001447B3">
  <w:delInstrText xml:space="preserve">4.htm"</w:delInstrText>  
</w:r>
<w:r w:rsidDel="001447B3">
   <w:fldChar w:fldCharType="separate"/>
</w:r>

我找不到像“parent.nextSiling”这样的确切树结构,因为根节点将基于内容。

foreach (XmlElement aNode in loadXML.SelectNodes("//w:fldChar[@w:fldCharType='begin]", nsmgr))
{
   XmlAttribute newAttr = loadXML.CreateAttribute("FieldValue");

   newAttr.Value = //i like to get text from w:fldChar[@w:fldCharType='begin] to next w:fldChar;

   aNode.Attributes.Append(newAttr);
}

在XPath中,“follow-sibling:fldChar”和“following :: fldChar”有两种不同的语法,但C#只有“NextSibling”,它只执行兄弟级别。

如何获取内部文本。

2 个答案:

答案 0 :(得分:0)

如果我理解正确你想要w:fldChar元素之间的所有节点,对吧?您可以通过直接在XPath中应用条件来实现:

w:r[preceding::w:r[w:fldChar[@w:fldCharType="begin"]]][following::w:r[w:fldChar]]

如果你不想要w:r元素而是想要子元素,你可以简单地添加一个子选择器:

w:r[preceding::w:r[w:fldChar[@w:fldCharType="begin"]]][following::w:r[w:fldChar]]/*

答案 1 :(得分:0)

我在你的帮助下完成了这项任务!

foreach (XmlElement aNode in loadXML.SelectNodes("//w:fldChar[@w:fldCharType='begin']", nsmgr))
{
  int total = aNode.SelectNodes("following::w:r", nsmgr).Count - aNode.SelectNodes("following::w:fldChar/following::w:r", nsmgr).Count;
  StringBuilder sb = new StringBuilder();

  for (int i = 0; i < total; i++)
  {
    XmlAttribute newAttr = loadXML.CreateAttribute("FieldValue");
    sb.Append(aNode.SelectNodes("following::w:r", nsmgr).Item(i).InnerText);
    newAttr.Value = sb.ToString();
    aNode.Attributes.Append(newAttr);
  }
}