2009-12-21 6 views
0

J'ai un chargé un document XML avec la structure suivante:LINQ to XML Débutant Question

<?xml version="1.0" encoding="UTF-8" ?> 
<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"> 
    <sheetData> 
    <row r="1" spans="1:2"> 
     <c r="A1" t="s"> 
     <v>0</v> 
     </c> 
     <c r="B1" t="s"> 
     <v>1</v> 
     </c> 
    </row> 
    </sheetData> 
</worksheet> 

Je veux interroger le document pour tous les éléments nommés c qui a l'attribut t = s.

J'ai essayé beaucoup de variations différentes sur la façon de le faire:

XDocument xmlDoc = XDocument.Load(@"..\..\Sheet1.xml"); 
var rows = from row in xmlDoc.Root.Descendants("worksheet").Elements("sheetData") 
     select row; 

Mais il retourne toujours un vide.

Qu'est-ce qui me manque?

Répondre

1

L'élément Racine est l'élément <worksheet/>. Par conséquent, si vous demandez à la racine d'un descendant de feuille de calcul, il retournera toujours un ensemble vide. Supprimez la clause .Descendants("worksheet") et vous devriez commencer à voir des résultats.

+0

Cela ne fonctionne pas. J'ai essayé: xmlDoc.Elements ("row") – coson

+0

Que diriez-vous de 'xmlDoc.Root.Elements (" sheetData "). Elements (" row) '? –

+0

J'ai essayé cela plus tôt et cela n'a pas fonctionné pour moi non plus. Je ne sais pas si cela a quelque chose à voir avec cela, mais l'extrait est à partir d'une feuille de calcul Microsoft Excel convertie en XML – coson

3

Vous devez spécifier l'espace de nom du noeud que vous obtenez avec Descendants ou Elements.

XNamespace ns = "http://schemas.openxmlformats.org/spreadsheetml/2006/main"; 
var rows = from row in xmlDoc.Root.Descendants(ns + "sheetData") 
     select row; 
+0

cela m'a pris la première fois que j'ai utilisé Linq pour XML. – Sekhat

0
XNamespace ns = "http://schemas.openxmlformats.org/spreadsheetml/2006/main"; 
XDocument xmlDoc = XDocument.Load(@"..\..\Sheet1.xml"); 
var rows = from row in xmlDoc.Root.Element(ns + "sheetData").Elements(ns + "row") 
     select row; 

Cela prend tous les éléments de "ligne" de l'intérieur de l'élément racine/sheetData.

0

Voici un code que j'ai écrit en Linqpad qui fait le filtre sur c où t = s.

Je sais que la réponse a été acceptée, mais cette solution ne fait le filtrage alors qu'aucun des autres réponses ci-dessus :) faire

Hope this helps!

void Main() 
{ 
    var xml = @"<?xml version=""1.0"" encoding=""UTF-8"" ?> 
     <worksheet xmlns=""http://schemas.openxmlformats.org/spreadsheetml/2006/main"" xmlns:r=""http://schemas.openxmlformats.org/officeDocument/2006/relationships""> 
      <sheetData> 
       <row r=""1"" spans=""1:2""> 
        <c r=""A1"" t=""s""> 
         <v>0</v> 
        </c> 
        <c r=""A2"" t=""b""> 
         <v>0</v> 
        </c> 
        <c r=""B1"" t=""s""> 
         <v>1</v> 
        </c> 
       </row> 
      </sheetData> 
     </worksheet>"; 

    XNamespace ns = "http://schemas.openxmlformats.org/spreadsheetml/2006/main"; 

    var d = XDocument.Parse(xml); 
    //d.Dump(); 
    //d.Dump("xdocument dump"); 

    var q = from cell in d.Root.Descendants(ns + "sheetData").Descendants(ns + "row").Descendants(ns + "c") 
      where cell.Attributes("t").FirstOrDefault().Value == "s" 
      select cell; 
    q.ToList().Dump(); 

}