Linq to XML动态XML Descendants

时间:2014-02-17 12:52:20

标签: c# xml linq

我正在使用Linq to XML synatx解析大量XML文件,当我尝试访问顶级元素时一切正常

var indexroot = (from element in prodcutDocument.Root.Descendants("indexroot")
                        select new
                        {
                            model = (string)element.Element("MODEL"),
                        }).FirstOrDefault()

当我需要访问我尝试过的文档的低级子级时,会出现问题:

var indexroot = (from element in prodcutDocument.Root.Descendants("indexroot")
                        select new
                        {
                            ddName = (string)element.Descendants("DD_NAME").Elements("name").First();
                            }).FirstOrDefault()

var indexroot = (from element in prodcutDocument.Root.Descendants("indexroot").Descendants("DD_NAME")
                             select new
                             {
                                 ddName = (string)element.Element("name")
                             }).FirstOrDefault();

可悲的是,这一切都不起作用,我得到同样的错误“序列不包含任何元素”。还有一件事情,有时候XML文档包含那些标签,有时候不足以处理这种情况吗?

var indexroot = (from element in prodcutDocument.Root.Descendants("indexroot").Descendants("DD_NAME")
                             select new
                             {
                                 ddName = (string)element.Element("name") ?? "-"
                             }).FirstOrDefault();

编辑: 我认为不可能粘贴简单的XML简短版本,所以这里是完整版:http://pastebin.com/uDkP3rnR和代码示例:

XDocument prodcutDocument = XDocument.Load(this.ServerPATHData + file); 

var indexroot = (from element in prodcutDocument.Root.Descendants("indexroot")
            select new
            {
                modelis = (string)element.Element("MODELIS"),
                T2918_0 = (string)element.Descendants("dd_DARBINIS_GRAFIKAS_SPEC").First()
            }).FirstOrDefault();

writeTxt.WriteLine("modelis: " + indexroot.modelis);
writeTxt.WriteLine("T2979_0" + indexroot.T2918_0); 

2 个答案:

答案 0 :(得分:0)

你可以改变:

element.Descendants("dd_DARBINIS_GRAFIKAS_SPEC").First()

到此:

element.Descendants("dd_DARBINIS_GRAFIKAS_SPEC").FirstOrDefault() ?? "-"

答案 1 :(得分:0)

在检查您在PasteBin上发布的示例XML时,在我看来,您提到的元素只出现一次。要访问它们,您只需指定每个路径,如下所示:

XElement indexroot = document.Root.Element("indexroot");
XElement modelis = indexroot.Element("MODELIS");
XElement dd_dgs = indexroot.Element("dd_DARBINIS_GRAFIKAS_SPEC");

XElement voltageuv = dd_dgs.Element("VoltageUV");

string t2979_0 = (string)voltageuv.Element("T2979_0");
string t2861_60 = (string)voltageuv.Element("T2861_60");
string t2757_121 = (string)voltageuv.Element("T2757_121");

(请注意,如果您尝试访问的任何元素可能不存在,则可能需要检查null。如果不这样做,您将遇到{{1} }。)

以下是您发布的XML片段,其中包含上述代码的上下文:

NullReferenceException