Linq to Xml问题:挣扎着一个简单的例子

时间:2011-03-23 20:38:26

标签: c# xml

我正在尝试将XML用于一些简单的格式化和嵌入式链接。我正在尝试使用Linq解析XML到Xml,但我正在努力解析带有嵌入元素的文本“Value”。例如,这可能是我要解析的一段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”的文本节点。

3 个答案:

答案 0 :(得分: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 :(得分: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."

答案 2 :(得分:1)

XElement.Nodes()将仅枚举顶级子节点。