使用XDocument问题读取XML

时间:2010-01-18 13:59:57

标签: c# .net xml

我有以下XML(.rdl报告的一部分):

<Report xmlns:rd="http://schemas.microsoft.com/SQLServer/reporting/reportdesigner" xmlns="http://schemas.microsoft.com/sqlserver/reporting/2008/01/reportdefinition">
  <DataSources>
    <DataSource Name="TMSSharepointDataSource">
      <DataSourceReference>TMSSharepointDataSource</DataSourceReference>
      <rd:DataSourceID>f06ffa33-238f-4d83-adfe-1eaa8df96e90</rd:DataSourceID>
    </DataSource>
  </DataSources>
</Report>

我尝试使用以下代码解析并阅读它:

byte[] fileContent = File.ReadAllBytes(@"path");
            UTF8Encoding unicode = new UTF8Encoding();
            string stringContent = unicode.GetString(fileContent);

            XDocument xml = XDocument.Parse(stringContent);
            XElement dsNode = xml.Root.Element("DataSources");

我无法弄清楚为什么dsNode总是为空?

2 个答案:

答案 0 :(得分:3)

这是名称空间问题......您需要为DataSources元素指定名称空间。幸运的是,LINQ to XML使这非常简单:

XNamespace ns = "http://schemas.microsoft.com/sqlserver/" + 
        "reporting/2008/01/reportdefinition";
XElement dsNode = xml.Root.Element(ns + "DataSources");

注意根元素的xmlns="http://..."部分,这意味着元素及其下面没有显式命名空间的所有元素都会继承该命名空间。

答案 1 :(得分:0)

您可能缺少命名空间引用。您的DataSources将继承Report节点的名称空间,您将需要命名空间和元素本地名称来生成XName。

或者,您可以执行以下操作并跳过命名空间检查:

XElement dsNode = 
  xml
  .Root
  .DescendantNodes()
  .Where(e => e.Name.LocalName.Equals("DataSources"))
  .First();

这将返回本地名称为DataSources的第一个节点。在您的示例中,这将是DataSources元素。

此外,您加载文档非常笨拙。我会建议以下内容:

XDocument xml = XDocument.Load(File.OpenRead(@"path"));