2011-03-23 74 views
1

我正在嘗試使用XML來進行一些簡單的格式化和嵌入式鏈接。我試圖用Linq來解析XML,但是我正在努力解析帶有嵌入元素的文本「Value」。例如,這可能是一件XML的我想分析:Linq to Xml問題:用一個簡單的例子掙扎

<description>A plain <link ID="1">table</link> with a green hat on it.</description> 

從本質上講,我想通過在描述節點的值的「流程」一一列舉。在上面的例子中,將會有一個文本節點,其值爲「A plain」,後跟一個「link」元素,其值爲「table」,後面是另一個文本節點,其值爲「 「。

我該怎麼做?我嘗試枚舉根XElement的Elements()枚舉,但只返回鏈接元素,就像Descendants()一樣。 DescendantNodes()確實返回了所有節點,但它也返回了鏈接元素的子節點。在這種情況下,除了包含它的元素之外,還包含一個包含「table」的文本節點。

回答

1

您需要訪問Nodes() method,檢查XmlNodeType,並根據需要進行強制轉換以訪問每個對象的屬性和方法。

例如:

var xml = XElement.Parse(@"<description>A plain <link ID=""1"">table</link> with a green hat on it.</description>"); 

foreach (var node in xml.Nodes()) 
{ 
    Console.WriteLine("Type: " + node.NodeType); 
    Console.WriteLine("Object: " + node); 
    if (node.NodeType == XmlNodeType.Element) 
    { 
     var e = (XElement)node; 
     Console.WriteLine("Name: " + e.Name); 
     Console.WriteLine("Value: " + e.Value); 
    } 
    else if (node.NodeType == XmlNodeType.Text) 
    { 
     var t = (XText)node; 
     Console.WriteLine(t.Value); 
    } 
    Console.WriteLine(); 
} 
1

只需使用你的描述元素的Nodes()方法。

var xmlStr = @"<description>A plain <link ID=""1"">table</link> with a green hat on it.</description>"; 
var descriptionElement = XElement.Parse(xmlStr); 
var nodes = descriptionElement.Nodes(); 
foreach (var node in nodes) 
    Console.WriteLine("{0}\t\"{1}\"", node.NodeType, node); 

產量:

Text "A plain " 
Element "<link ID="1">table</link>" 
Text " with a green hat on it." 
1

XElement.Nodes()將只枚舉頂層子節點。