2009-04-27 4 views
1

Ich versuche, mehr in LINQ-to-XML zu bekommen, also habe ich mir ein nettes kleines gemacht Beispiel XML-Dokument zum Ausprobieren. Außerdem habe ich versucht (und erfolgreich), ein eigenes XML-Schema für diese Datei zu erstellen, nur um die Dinge zu testen. Das XML-Dokument ist ziemlich einfach, und ziemlich sieht ähnlich wie folgt aus:Meine linq-Abfrage funktioniert nicht beim Hinzufügen des xmlns-Attributs zum root-Element in meinem XML-Dokument

<cars xmlns="/carsSchema.xsd"> 
    <car age="5"> 
    <carId>1</carId> 
    <brand>BMW</brand> 
    <model>320i</model> 
    <color paintType="metallic">Red</color> 
    </car> 

    <car age="2"> 
    <carId>2</carId> 
    <brand>VW</brand> 
    <model>Golf</model> 
    <color paintType="matt">White</color> 
    </car> 
[...] 
</cars> 

nun dieses Dokument Abfrage funktioniert gut, wenn ich die xmlns -Attribut aus dem Wurzelelement entfernen. Wenn ich es wieder hinzufüge, gibt die Abfrage null und nichts zurück. Ich habe versucht, es selbst herauszufinden, aber ich muss noch eine Lösung finden, die mein Problem behebt.

Hier ist der C# -Bit:

 XDocument xmlDoc = XDocument.Load(currentDir + "\\Cars.xml"); 

// XNamespace ns = "{" + currentDir + "\\carSchema.xsd}"; 
// Tried to query xmlDoc.Descendants(ns+"car") after reading another post, 
// but that made no difference 

     var carInfo1 = from car in xmlDoc.Descendants("car") 
         select (string)car.Element("brand") + ": " + (string)car.Element("model"); 

Jeder sieht, was falsch ist? Und warum sollte LINQ wirklich das viel über den Namespace kümmern? Kann es nicht einfach meine Datei abfragen und kümmert mich nicht darum?

Vielen Dank im Voraus! :-)

Antwort

3

Wenn Sie nach Nachkommen und Element suchen, müssen Sie den Namespace angeben. Dies ist mit LINQ to XML ziemlich einfach. Es sieht aus wie Sie fast da waren, es aber nicht für die Elemente tun:

XDocument xmlDoc = XDocument.Load(currentDir + "\\Cars.xml"); 
// I don't think namespace URIs are really resolved. I'm not sure though - 
// for a proof of concept, I suggest you use a namespace of 
// http://dummy.com/dummy.xsd 
XNamespace ns = "/carSchema.xsd"; 

var carInfo1 = from car in xmlDoc.Descendants(ns + "car") 
        select (string)car.Element(ns + "brand") + ": " + 
          (string)car.Element(ns + "model"); 
+0

Nun, das hat es behoben. Danke vielmals! Gibt es jedoch eine Möglichkeit, LINQ den Namespace zu ignorieren, außer es aus dem XML-Dokument zu entfernen? –

+0

Ich glaube nicht, nein. Obwohl es ein bisschen nervig ist, denke ich, dass es wirklich Sinn macht. –

1

Dies funktioniert auch, wenn Sie einen fiktiven verwenden „http: //“ als Namespace-URI. Du hast Recht. Es ist nicht gelöst.

 private XNamespace ns = "http://schemas.xin2009.com/DataMap/2009"; 

       IEnumerable<string> names = (from spnode in _map.Descendants(ns + "Entity") 
             where spnode.Attribute("name").Value == this.Entity 
             select spnode.Element(ns + "StoredProcedure").Attribute("name").Value); 

Beachten Sie, dass die ns für den Namespace nur zu den Elementen und nicht zu den Attributen hinzugefügt werden mussten.