Чтение XML с проблемой XDocument - PullRequest
0 голосов
/ 18 января 2010

У меня есть следующий 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 ]

3 голосов
/ 18 января 2010

Это проблема пространства имен ... вам нужно указать пространство имен для элемента DataSources.К счастью, LINQ to XML делает это действительно простым:

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

Обратите внимание на xmlns="http://..." часть корневого элемента, что означает, что этот элемент и все элементы под ним, которые не имеют явного пространства имен, наследуют это пространство имен.

0 голосов
/ 18 января 2010

Возможно, вам не хватает ссылки на пространство имен. Ваши источники данных будут наследовать пространство имен узла отчета, и вам потребуется как пространство имен, так и локальное имя элемента для генерации XName.

В качестве альтернативы вы можете сделать следующее и пропустить проверку пространства имен:

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

Это вернет первый узел, локальное имя которого - DataSources. В вашем примере это будет элемент DataSources.

Кроме того, загрузка документа очень неуклюжа. Вместо этого я бы предложил следующее:

XDocument xml = XDocument.Load(File.OpenRead(@"path"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...