在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”,它只执行兄弟级别。
如何获取内部文本。
答案 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);
}
}