2010-01-18 5 views
0

У меня есть следующий XML (часть RDL-отчета):Чтение XML с проблемой XDocument

<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"); 

Я могу» t выяснить, почему dsNode всегда null?

+0

какой-либо причине вы используете File.ReadAllBytes + UTFEncoding + XDocument.Parse вместо того, чтобы просто XDocument.Load? http://msdn.microsoft.com/en-us/library/system.xml.linq.xdocument.load.aspx – dtb

+0

yep, в «код назначения» (это был всего лишь тестовый код). Я получаю байтовый массив как input – agnieszka

ответ

3

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

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

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

+0

хорошо я подозревал, что это было что-то с пространствами имен, но я думал, что узел не имеет пространства имен (хотя он был бы , если бы он был). – agnieszka

+0

Это не rd - это * другое * пространство имен, объявленное в корневом элементе. rd для reportdesigner, значение по умолчанию - для определения отчета. –

+0

так или иначе явным образом, я просто должен знать, что дочерние элементы наследуют пространство имен – agnieszka

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")); 
Смежные вопросы