Linq to XML Descendants无法读取部分xml

时间:2014-03-03 14:55:50

标签: c# xml linq

我有像这样的XML文档

<document>
    <indexroot>
        <type>type</type>
        <model>model</model>
    </indexroot>
    <root>
        <model_type1>model type 1</model_type1>
        <model_type2>model type 2</model_type2>
    </root>
</document>

和linq到xml代码:

var elements = (from element in pdb.Descendants()
                select new
                {
                    type = (string)element.Element("type") ?? "-",
                    model= (string)element.Element("model") ?? "-",
                    model_type1= (string)element.Element("model_type1") ?? "-",
                    model_type2= (string)element.Element("model_type2") ?? "-"
                }).FirstOrDefault();

我得到了类型和模型变量,但似乎我无法达到model_type1和model_type2,现在我明白这是因为indexroot和root标签,如果我将这些标签分隔成不同的linq到xml代码块与后代(“indexroot”)和Descendants(“root”),一切正常,但我不是一个块,是否有可能实现这一点,以及如何实现?

1 个答案:

答案 0 :(得分:0)

您需要为要提取的每个元素向下导航XML层次结构。

这是因为Element方法只查看直接子节点,而不是节点的所有后代。来自the documentation

  

获取具有指定XName的第一个(按文档顺序)子元素。

仅使用Linq-to-XML的一个实现可能是:

 xml = "<document>" +
    "<indexroot>" +
    "    <type>type</type>" +
    "    <model>model</model>" +
    "</indexroot>" +
    "<root>" +
    "    <model_type1>model type 1</model_type1>" +
    "    <model_type2>model type 2</model_type2>" +
    "</root>" +
    "</document>";

    XDocument doc = XDocument.Parse(xml);

    var newItem = (from element in doc.Descendants("document")
                select new 
    {
        Type = (string)element.Element("indexroot").Element("type") ?? "-",
        Model = (string)element.Element("indexroot").Element("model") ?? "-",
        ModelType1 = (string)element.Element("root").Element("model_type1") ?? "-",
        ModelType2 = (string)element.Element("root").Element("model_type2") ?? "-",
    }).FirstOrDefault();

    Console.WriteLine(newItem);