2012-09-27 62 views
0

我有一個Xml節點供我處理。以下是我的xml節點。如何在C#中獲取我的xmlnode的特定的innertextxt?

<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:pict><w:p><w:r><w:t><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

使用Linq TO XML或XPath表達式。 – adatapost

回答

1

您可以使用XPath:(我認爲以下應爲你工作)

w:p/w:r/w:t 
0

您需要檢查每一個元素p到沒有可anchestors的是pict元素。

var result = XElement.Load(@"path-to-your-xml") 
        .Descendants("t") 
        .Where(e => !e.AnchestorsAndSelf().Any(a => a.Name.LocalName == "pict")); 
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命名空間的信息。

相關問題