2009-05-22 6 views
1

Ich hatte das Gefühl, mit meinen köstlichen Lesezeichen und LINQ to XML einige lustige Sachen zu machen, und ich frage mich, ob es eine Möglichkeit gibt, das Tag-Attribut in LINQ zu teilen.Wie kann ich den Wert eines Attributs in LINQ (-to-XML) aufteilen?

Was ich mit gemeint habe spaltete den Tag in LINQ wurde eine Sammlung von Zeichenketten für jeden Post-Element zu erzeugen, so dass das erwartete Ergebnis wäre eine allgemeine Sammlung von post Elemente sein, mit seinen Attributen als Eigenschaften, wo die tag Eigenschaft ist selbst eine andere Sammlung von Strings, deren Elemente jeweils ein Tag sind.

Für diejenigen, die nicht sehr vertraut mit exportierten xml des delicious.com, Heres die Grundstruktur eines Elements:

<post 
    href="http://stackoverflow.com/" 
    hash="e4a42d992025b928a586b8bdc36ad38d" 
    description="Stack Overflow" 
    tag="code development programming community tips answers reference" 
    time="2009-05-22T19:44:09Z" 
    extended="Stack Overflow is a programming Q & A site that's free." 
    meta="e0bf85c9df073cd51cc5528637db5277" 
/> 

Hier ist der Code-Snippet Ich verwende:

XDocument delicious = XDocument.Load("all.xml"); 

    var bookmarks = from posts in delicious.Descendants().Attributes("tag") 
        select (string)posts; 

Irgendwelche Ideen, Vorschläge, Kommentare würden wirklich geschätzt werden.

Antwort

1

Wie ist Ihre gewünschte Ausgabe eigentlich? Möchten Sie ein Array für jeden Wert im Feld "Tag"?

var bookmarks = from posts in delicious.Descendants().Attributes("tag") 
        select ((string)posts).Split(" "); 

Das würde Ihnen eine Liste von Arrays geben. Es ist schwer zu sagen, wie man das erreicht, was man will, da es nicht sehr gut spezifiziert ist.

+0

Danke für Ihre Antwort Andrew, eigentlich möchte ich in der Lage sein zu berechnen diese Tags, wenn sie unabhängig waren, sagen wir, wie viele "Entwicklungs" -Tags ich in einem bestimmten Monat hinzugefügt habe, et cetera. –

+0

Sie könnten die Zeichenfolge abrufen und eine where-Klausel mit Contains "development" hinzufügen. Dadurch erhalten Sie Beiträge mit Attributen, die als Teil des Tags die Entwicklung aufweisen. – shahkalpesh

+0

Danke Shahkalpesh! Ich habe über diesen Ansatz nachgedacht, der im Moment wahrscheinlich die bestmögliche Lösung ist. –

1

String-Klasse hat eine Split-Methode.
Ist das wonach Sie suchen?

BEARBEITEN: string.Join (Environment.NewLine, bookmarks.ToArray());

+0

Nicht wirklich, eigentlich muss ich sie * in * LINQ teilen, damit ich sie ihren Operatoren wie count() und sum() freigeben kann –

1

Was ich tat, war, 'set' zu verwenden und den Wert dieser Variablen zuzuweisen, und dann set verwendet, um weiter zu manipulieren, so dass ich es am Ende nur in meiner linq-Abfrage verwenden konnte eine Form, die mir jetzt nützlich war. :)

+0

Danke für deinen Beitrag James! etwas mehr ausarbeiten? –

+0

Sorry über so lange zu beantworten, aber hier ist etwas, was ich getan habe: var q = aus Datei in Directory.GetFiles (...) let fi = neue FileInfo (Datei) let c = XElement.Load (Datei) als XElement lettimetime =! string.IsNullOrEmpty (c.Element ("LiveTime"). Value)? int.Parse (c.Element ("Livetime") Wert.): -1 wählen neue { Deadtime = Totzeit, Durch gesetzt verwenden Sie Manipulationen auf dem Attribut tun können. –