我有一个Xml节点供我处理。下面是我的xml节点。
<w:p>
<w:r>
<w:t>
Text1
</w:t>
</w:r>
<w:r>
<w:pict>
<w:p>
<w:r>
<w:t>
text2
</w:t>
</w:r>
</w:p>
</w:pict>
</w:r>
<w:r>
<w:t>
Text3
</w:t>
</w:r>
<w:r>
</w:p>
现在我想从<w:p><w:r><w:t>
而不是<w:p><w:r><w:pict><w:p><w:r><w:t>
获取内部文字。
所以,我所需的输出是Text1Text3
我的C#代码是:
XmlNodeList pNode = xDoc.GetElementsByTagName("w:p");
for (int i = 0; i < pNode.Count; i++)
{
if(i==0) //This is my criteria
{
XmlNode firstNode = pNode[i];
string innerText=firstNode.innerText.toString().Trim();
}
}
但它返回所有内部文本,如Text1Text2Text3
请指导我解决这个问题?
答案 0 :(得分:1)
您可以使用XPath :(我认为以下内容适合您)
w:p/w:r/w:t
答案 1 :(得分:0)
您需要检查每个元素p
,它的任何一个元素都不是pict
元素。
var result = XElement.Load(@"path-to-your-xml")
.Descendants("t")
.Where(e => !e.AnchestorsAndSelf().Any(a => a.Name.LocalName == "pict"));
答案 2 :(得分:0)
我建议您使用XDocument
(如果您使用的是.NET 3.5或更高版本)。此代码获取具有模式p/r/t
但没有pict/p/r/t
的所有元素的值:
// Use this if you're loading XML from a string
XDocument doc = XDocument.Parse(inputString);
// Use this if you're loading XML from a file
//XDocument doc = XDocument.Load(<filepath>);
var pElements = doc.Root
.Descendants()
.Where(el => el.Name.LocalName == "p" && el.Parent.Name.LocalName != "pict");
List<string> innerTexts = new List<string>();
foreach(XElement p in pElements)
{
var rElements = p.Elements().Where(el => el.Name.LocalName == "r");
foreach(XElement r in rElements)
{
var tElements = r.Elements().Where(el => el.Name.LocalName == "t");
innerTexts.AddRange(tElements.Select(el => el.Value).ToArray());
}
}
我使用了LocalName
,因为没有提供有关w
命名空间的信息。