2009-09-11 104 views
1

假設我有一些XmlElement;我們稱之爲element。如果我想獲得該元素的所有子節點,我可以撥打element.ChildNodes。如果我想要元素及其所有子女的文字,那麼我可以使用element.InnerText獲取XmlElement頂級文本的最簡單方法是什麼?

然而,假設我有一些XML,看起來像這樣:

<TopElement attr1="value1" attr2="value2"> 
    This is the text I want. 
    <ChildElement1>This is text I don't want.</ChildElement1> 
    <ChildElement2>This is more text I don't want.</ChildElement2> 
</TopElement> 

如果我有element.InnerText去,我所得到的是這樣的:

這是我的文字是want.This文字我 不想要。這是更多的文字我不 想要的。

如果我只想內TopElement該文本而沒有任何的孩子,我可以這樣做:

Dim txt As String 
For Each child As Xml.XmlNode In XmlElement.ChildNodes 
    If TypeOf child Is Xml.XmlText Then 
     txt = child.InnerText 
     Exit For 
    End If 
Next 

但這似乎相當愚蠢的我。當然有更好的方法?

編輯:對不起,我最初沒有指定:我正在尋找一種不涉及LINQ的解決方案(我們在這裏使用.NET 2.0處於黑暗時代)。

+0

我會以爲使用.net 1.0或1.1將是黑暗時代。 ;) – 2009-09-11 14:07:30

+0

我會說.NET 1.0和1.1是冰河世紀,2.0是黑暗時代,3.5是文藝復興時期,4.0是某種科幻幻想世界。 – 2009-09-11 18:00:13

回答

3

您可以使用XPath表達式將專門查找文本節點(遺憾的C#)

XmlText text = doc.SelectSingleNode("/TopElement/text()") as XmlText; 
if (text != null) 
{ 
    Console.WriteLine(text.Value); 
} 

(其中doc是包含您的XML的XmlDocument

+0

這正是我一直在尋找的。太好了! – 2009-09-11 17:56:28

2

從技術上講,TopElement中的文本是一個孩子節點。

class Program 
{ 
    static string xml = @"<Top>Text<child/><child/></Top>"; 

    static void Main(string[] args) 
    { 
     XmlDocument xdoc = new XmlDocument(); 
     xdoc.LoadXml(xml); 

     Console.WriteLine(xdoc.DocumentElement.ChildNodes[0].Value); 

     Console.ReadLine(); 
    } 
} 
+0

我在這個答案中看到的主要問題是它假定ChildNodes [0]將是文本。我不確定會有頂級文本;我想看看IF是否存在,如果有的話,以獲得它。 – 2009-09-11 14:07:45

+1

絕對如此。我沒有看到你上面提供的解決方案有什麼問題。 InnerText獲取所有子節點的文本。如果你想要一個特定的childNode的文本,你將不得不遍歷它們來找到它。 – bryanbcook 2009-09-11 14:15:53

1
Dim txt As String 

If TypeOf XmlElement.FirstChild Is Xml.XmlText Then 
     txt = XmlElement.FirstChild.InnerText 
End If 
+0

我喜歡這個答案;但是,它確實假設如果有頂級文本,它將是第一個孩子。考慮這樣的事情:不想要的文字想要的文字。在這種情況下,你的代碼會錯過想要的文本。 – 2009-09-11 14:28:08

+0

如果文本可以在子節點之間的任何位置,則需要迭代並且解決方案非常好。 – manji 2009-09-11 14:44:07

2
XmlDocument document = new XmlDocument(); 
document.LoadXml(yourXml); 

//Find the first child whos type is XmlText 
var nodeYouWant = document.DocumentElement.ChildNodes.OfType<System.Xml.XmlText>().FirstOrDefault(); 

編輯

既然你不能使用LINQ,你仍然可以使用好醇」 XQuery和請求節點文本

XmlNode nodeYouWant = document.DocumentElement.SelectSingleNode("./text()"); 

這即使您想要的文本位於兩個子節點之間也可以工作。

0

這裏有一個例子是將給你的請求文本:

static void Main(string[] args) 
     { 
      var document = XDocument.Load("../../TestXmlFile.xml"); 

      if(document.Root == null) return; 

      var text = ((XText) document.Root.FirstNode).Value; 

      Console.WriteLine(text); 

     } 
相關問題