Come utilizzare XPath con XElement o LINQ?

Consideriamo il seguente XML:

<response>
  <status_code>200</status_code>
  <status_txt>OK</status_txt>
  <data>
    <url>http://bit.ly/b47LVi</url>
    <hash>b47LVi</hash>
    <global_hash>9EJa3m</global_hash>
    <long_url>http://www.tumblr.com/docs/en/api#api_write</long_url>
    <new_hash>0</new_hash>
  </data>
</response>

Sto cercando una davvero breve modo per ottenere il valore della <hash> elemento. Ho provato:

var hash = xml.Element("hash").Value;

Ma che non funziona. È possibile fornire una query XPath per un XElement? Posso farlo con il vecchio System.Xml framework, fare qualcosa di simile:

xml.Node("/response/data/hash").Value

C’è qualcosa di simile in un LINQ spazio dei nomi?


AGGIORNAMENTO:

Dopo monkeying intorno con questo po ‘ di più ho trovato un modo per fare quello che sto cercando di fare:

var hash = xml.Descendants("hash").FirstOrDefault().Value;

Sarei comunque interessato a vedere se qualcuno ha una soluzione migliore?

  • Non utilizzare FirstOfDefault() in questo caso, perché se “hash” non è stato trovato otterrete una NullReferenceException. Primo utilizzo (), invece, si ottiene un più descrittivo eccezione.
  • Primo utilizzo() se si prevede che “hash” per sempre esiste. In caso contrario, FirstOrDefault() è bene come controllare null prima di accedere alla proprietà di Valore.
InformationsquelleAutor Paul Fryer | 2010-09-04

 

5 Replies
  1. 133

    Utilizzare XPath con LINQ to XML aggiungi un uso dichiarazione per System.Xml.XPath, questo porterà i metodi di estensione di Sistema.Xml.XPath.Estensioni nell’ambito.

    Nel tuo esempio:

    var value = (string)xml.XPathEvaluate("/response/data/hash");
    • OK, sembra più vicino alla domanda originale
    • In realtà, è (ora?) in System.Xml.XPath.
    • esso non si è mosso. Il link di nota è la classe di documenti, di poco precedenti mi danno lo spazio dei nomi (senza link).
    • Si noti inoltre che è necessario per aggiungere un assembly tramite NuGet per UWP apps: link
    • Io trovo più facile utilizzare il metodo XPathSelectElement per ottenere un XElement invece di un oggetto.
  2. 38

    Altri sono del tutto ragionevolmente suggerito come usare “nativo” LINQ to XML query per fare quello che vuoi.

    Tuttavia, nell’interesse di dare un sacco di alternative, prendere in considerazione XPathSelectElement, XPathSelectElements e XPathEvaluate per valutare le espressioni XPath contro un XNode (sono tutti metodi di estensione sul XNode). È inoltre possibile utilizzare CreateNavigator per creare un XPathNavigator per un XNode.

    Personalmente sono un grande fan di utilizzo di LINQ to XML direttamente con le API, come io sono un grande LINQ fan, ma se sei più comodo con XPath, il sopra può aiutare.

  3. 14

    Vedere, quando ha a che fare con LINQ to XML perchè non utilizzare LINQ per ottenere il reale oggetto.

    Discendenti trovare ogni elemento dall’intero XML e un elenco di tutti gli oggetti con il nome specificato. Quindi nel tuo caso hash è il nome cui si trova.

    Così, piuttosto che fare

    var hash = xml.Descendants("hash").FirstOrDefault().Value;

    Vorrei spezzare come :

    var elements = xml.Descendants("hash");
    var hash = elements.FirstOrDefault();
    
    if(hash != null)
     hash.Value //as hash can be null when default. 

    In questo modo si potrebbe anche ottenere gli attributi, i nodi elementi etc.

    Controllare questo articolo per ottenere una chiara idea su di esso in modo che aiuta.
    http://www.codeproject.com/KB/linq/LINQtoXML.aspx
    Spero che questo vi aiuterà.

    • per spiegare il valore di separare l’elemento alla variabile, in modo che si possono fare altre cose, come ottenere gli attributi, ecc..
    • Una buona ragione per usare XPath è che si perde tutte quelle cose XPath può fare e Linq non è possibile. La prima evidente che viene a mente è quello di eseguire una query che viene definito in fase di runtime (diciamo un’espressione di lettura, dalla configurazione o qualsiasi altra cosa).
  4. 8

    È possibile utilizzare .Element() metodo per la catena di elementi a forma di XPath-come la struttura.

    Per il tuo esempio:

    XElement xml = XElement.Parse(@"...your xml...");
    XElement hash = xml.Element("data").Element("hash");
    • Penso che questa sia la risposta migliore, perché ottiene il lavoro fatto, pur continuando a utilizzare LINQ to XML (consigliata) invece di usare XPath con query LINQ to XML (che non è raccomandato).
    • Utilizzando XPath è più conciso, soprattutto se siete alla ricerca per qualsiasi grand bambini o di là.
    • Element() restituisce null quindi, questo è sicuro.
  5. 2

    Ho provato a venire con un LINQesq framework per la generazione di xpath.
    Esso consente di descrivere xpath utilizzando c# le espressioni lambda

    var xpath = CreateXpath.Where(e => e.TargetElementName == "td" && e.Parent.Name == "tr");
    
    var xpath = CreateXpath.Where(e => e.TargetElementName == "td").Select(e => e.Text);

    Non sono sicuro se questo è utile in questo contesto, ma è possibile trovare la documentazione qui:

    http://www.syntaxsuccess.com/viewarticle/how-to-create-xpath-using-linq

Lascia un commento