2010-12-09 4 views
1

J'essaye d'analyser le fichier XML suivant et rien de ce que je fais n'aboutit à autre chose que la racine ou le premier noeud.Impossible d'accéder à XML avec Linq

 <?xml version="1.0" encoding="utf-8" ?> 
    <Report {attributes}> 
     <table1> 
      <Detail_Collection> 
       <Detail {attributes} /> 
       <Detail {attributes} /> 
       <Detail {attributes} /> 
      </Detail_Collection> 
     </table1> 
    </Report> 

Je suis en train d'obtenir une liste de Détail pour que je puisse obtenir les valeurs d'attributs, mais tout ce que j'ai essayé des résultats dans aucune donnée. Ma dernière tentative est celle-ci ...

var xml= XDocument.Load(FileDetails.FullName); 
var xml1 = XDocument.Parse(xml.Root.FirstNode.ToString()); 
var xml3 = from e in custs.Root.Elements("Detail") select e; 
var xml4 = from e in xml1.Elements("Detail") select e; 

différent tentative

var xml = XDocument.Load(FileDetails.FullName); 
var root = xml.Root; 
var els = root.Descendants("Detail"); 

Les écrans ci-dessus dans la fenêtre immédiate:

root.Descendants ("Détail") {Système .Xml.Linq.XContainer.GetDescendants} nom: null auto: false System.Collections.Generic.IEnumerator.Current: null System.Collections.IEnumerator.Current: null

Le problème est avec les attributs de l'élément du rapport:

<Report p1:schemaLocation="Info_x0020_Tickets_x0020_Entered http://domain/ReportServer?%2fInfo+Reporting%2fInfo+Tickets+Entered&rs%3aCommand=Render&rs%3aFormat=XML&rs%3aSessionID=vcvb0p452bb3na45havjes55&rc%3aSchema=True" Name="Info Tickets Entered" textbox9="1247" xmlns:p1="http://www.w3.org/2001/XMLSchema-instance" xmlns="Info_x0020_Tickets_x0020_Entered"> 

Ceci est de SQL Server Reporting Server, je vais devoir Enlevez un par un et trouvez le coupable.

Ceci est la solution finale à ce problème Il peut y avoir une meilleure façon, mais une fois que les données sont chargées vous ne pouvez pas retirer facilement l'espace de noms.

//load the original document 
var xml = XDocument.Load(FileDetails.FullName); 
//remove all the superflouos data attributes 
xml.Root.RemoveAttributes(); 
//turn into a string 
var content = xml.Root.ToString(); 
//remove the official namespace, there is no easy way to remove the namespace after document has been loaded, so we'll replace it 
var newXmlContent = content.Replace("<Report xmlns=\"Info_x0020_Tickets_x0020_Entered\">", "<Report>"); 
//parse the updated string into a workable document 
var newXml = XDocument.Parse(newXmlContent).Root; 

Ceci retourne un nouveau document XML qui peut être traité normalement.

+0

Quels sont les attributs? – SLaks

+0

Le problème réside dans les attributs de * Report * –

+0

Quels sont les attributs dans le XML? – SLaks

Répondre

1

appel custs.Root.Elements("Detail") retournera tous les <Detail> éléments qui sont directs enfants de l'élément racine (<Report>). Vous devez appeler le Descendants.

Vous pouvez également appeler

custs.Root.Element("table1").Element("Detail_Collection").Elements("Detail") 

EDIT: Vos éléments sont probablement dans un espace de noms (xmlns="..." dans la racine).
Vous devez demander XLINQ pour les éléments dans l'espace de noms correct:

XNamespace ns = "Info_x0020_Tickets_x0020_Entered"; 
var els = root.Descendants(ns + "Detail"); 
+0

C'était le nom - j'avais deux espaces de noms, j'ai supprimé le second et ça marche. –

0
var xml= XDocument.Load(FileDetails.FullName); 
var detailList = xml.Root.Decendants("Detail"); 

Cela vous donnera une collection dénombrable de XElements qui sont tous les Detail éléments du XML.

+0

J'ai essayé, ça ne marche pas. (J'ai mis à jour plus de tentatives) –

0
string xml = @"<?xml version=""1.0"" encoding=""utf-8"" ?> 
<Report foo=""bar""> 
    <table1> 
     <Detail_Collection> 
      <Detail foo=""bar"" /> 
      <Detail foo=""bar"" /> 
      <Detail foo=""bar"" /> 
     </Detail_Collection> 
    </table1> 
</Report>"; 

     var doc = XDocument.Parse(xml); 
     foreach (var desc in doc.Root.Descendants("Detail")) 
     { 
      Console.WriteLine(desc.Attribute("foo").Value); 
     }