2009-03-30 13 views
0

Meine Anforderung hier ist, den Knoten, der mit dem Hostnamen übereinstimmt (z. B. Maschine1) abrufen und ich bekomme immer keine Ergebnisse zurück. Bitte lassen Sie mich wissen, was das Problem ist?LINQ to XML Frage

Danke für die Hilfe im Voraus !!!

XDocument configXML = XDocument.Load("the below xml"); 

var q = from s in configXML.Descendants("lcsetting") 
    where ((string)s.Element("host") == hostName)       
    select s; 

Die tatsächliche xml:

<lcsettings> 
    <lcsetting env="prod"> 
    <hosts usagelogpath=""> 
     <host>machine1</host> 
     <host>machine2</host> 
     <host>machine3</host> 
    </hosts> 
    </lcsetting> 
    <lcsetting env="qa"> 
    <hosts usagelogpath=""> 
     <host>machine4</host> 
     <host>machine5</host> 
     <host>machine6</host> 
    </hosts> 
    </lcsetting> 
    <lcsetting env="test"> 
    <hosts usagelogpath=""> 
     <host>machine7</host> 
     <host>machine8</host> 
     <host>machine9</host> 
    </hosts> 
    </lcsetting> 
</lcsettings> 

Antwort

4

Sie suchen ein host Element sucht direkt unter einem lcsetting - das tritt nicht auf, weil es immer ein hosts Element zwischen den beiden in der Hierarchie. Sie verwenden auch Element anstelle von Elements, was bedeutet, dass nur das erste Element mit dem richtigen Namen zurückgegeben wird.

Sie könnten Descendants wieder anstelle von Element verwenden ... aber Sie müssen den Zustand ändern. Etwas wie:

var q = from s in configXML.Descendants("lcsetting") 
     where s.Descendants("host").Any(host => host.Value == hostName) 
     select s; 

Alternativ können Sie Ihre Anfrage host Elemente finden machen und dann die Großeltern Element jeweils:

var q = from host in configXML.Descendants("host") 
     where host.Value == hostName 
     select host.Parent.Parent; 

(Dies setzt voraus, ein Host-Element nur einmal pro lcsetting auftreten wird; Wenn das nicht der Fall ist, können Sie einen Anruf zu Distinct hinzufügen.)

+0

Vielen Dank für Ihre Antwort. Ist es auch möglich, ein Standard-lcsetting-Element (z. B. "qa") abzurufen, wenn die Abfrage keine Ergebnisse zurückgibt. – Ganesha

1

"Host" ist kein Kind von "Lcsetting".

1

Das liegt daran, dass Sie einen <Gastgeber> Tag immedieately unter Ihrem lcsetting haben, das enthält Ihre <Host> Tags. <host> ist kein sofort Kind von <lcsetting>.

Diese Abfrage funktioniert:

var q = from s in configXML.Descendants("lcsetting").SelectMany(lcSetting => lcSetting.Descendants("host")) 
     where s.Name == "host" && s.Value == hostName 
     select s; 
1

Sie die Nachkommen sind die Auswahl lcsetting aber dann versucht, das Element Host zu überprüfen, die zwei Ebenen darunter ist. Die Element() - Funktion referenziert nur untergeordnete Elemente 1 Ebene tief. Ich würde empfehlen, dies zu ändern:

XDocument configXML = XDocument.Load("the below xml"); 
var q = from s in configXML.Descendants("lcsetting") 
     where s.Descendants("host").SingleOrDefault(e => e.Value == hostname) != null 
     select s;