2010-01-18 6 views
0

j'ai un code XML suivant (partie d'un rapport .rdl):XML de lecture avec le problème 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> 

J'essaie d'analyser et de le lire en utilisant le code suivant:

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

je peux » t comprendre pourquoi dsNode est toujours nul?

+0

Quel est le motif que vous utilisez File.ReadAllBytes + UTFEncoding + XDocument.Parse au lieu de simplement XDocument.Load? http://msdn.microsoft.com/en-us/library/system.xml.linq.xdocument.load.aspx – dtb

+0

Oui, dans le "code de destination" (c'était juste un code de test) je reçois un tableau d'octets en tant que entrée – agnieszka

Répondre

3

Il s'agit d'un problème d'espace de noms ... vous devez spécifier l'espace de noms pour l'élément DataSources. Heureusement, LINQ to XML fait vraiment facilement:

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

Notez la partie xmlns="http://..." de l'élément racine, ce qui signifie que l'élément et tous les éléments ci-dessous ce qui ne dispose pas d'un espace de noms explicite héritera cet espace de noms.

+0

bien je me doutais que c'était quelque chose avec les espaces de noms mais je pensais qu'un nœud n'a pas d'espace de noms (je pensais que ce serait si c'était le cas). – agnieszka

+0

Ce n'est pas rd - c'est l'espace de noms * other * déclaré dans l'élément racine. rd est pour reportdesigner, la valeur par défaut est reportdefinition. –

+0

de toute façon il n'est pas là explicitement, je dois juste savoir que les éléments enfants héritent de l'espace de noms – agnieszka

0

Il vous manque probablement une référence d'espace de noms. Vos DataSources hériteront de l'espace de noms du nœud Report et vous aurez besoin à la fois de l'espace de nom et du nom local de l'élément pour générer un XName.

Sinon, vous pouvez effectuer les opérations suivantes et ignorer le contrôle de l'espace de noms:

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

Ceci renvoie le premier nœud où le nom local est DataSources. Dans votre exemple, ce sera l'élément DataSources.

En outre, votre chargement du document est très maladroit. Je suggère ce qui suit à la place:

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