检查xml节点是否具有属性

时间:2016-05-18 16:05:03

标签: c# xml linq-to-xml

我有一个XML文件,它是从Windows应用程序生成的,如下所示" Repport.xml":

<ArrayOfAutoReportXML>  
    <AutoReportXML ReportName="Report1" ReportID="1" />
    <AutoReportXML ReportName="Report2" ReportID="2" />
    <AutoReportXML ReportName="Report3" ReportID="3" />
    <AutoReportXML ReportName="Report4" ReportID="4" />
    <AutoReportXML ReportName="Report5" ReportID="5" />
</ArrayOfAutoReportXML>

我正在尝试检查ReportName是否已经存在,我正在尝试使用以下代码来执行此操作:

using (FileStream fs = new FileStream("Repport.xml", FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite))
{
    XDocument doc = XDocument.Load(fs);

    string attrReportname = (string) doc.Elements("AutoReportXML")
        .Where(ox => ox.Attribute("ReportName").Value.ToString() == ReportName)
        .FirstOrDefault();
}

attrReportNamenull

1 个答案:

答案 0 :(得分:1)

问题是Elements只会从当前上下文中找到直接子元素。 doc.Elements()返回的唯一元素是ArrayOfAutoReportXML

您需要的是Descendants,它遍历文档中的所有元素。

根据该属性检查报告是否存在:

var reportExists = doc
    .Descendants("AutoReportXML")
    .Attributes("ReportName")
    .Any(x => x.Value == "Report1");

如果您需要使用多个属性进行检查:

var reportExists = doc
    .Descendants("AutoReportXML")
    .Any(x => (string)x.Attribute("ReportName") == "Report1" && 
              (int)x.Attribute("ReportID") == 1);

有关正常工作的演示,请参阅this fiddle