Domanda

Sto cercando di analizzare un po 'di dati da un file HTML, ma la mia dichiarazione Linq non sta funzionando. Ecco l'XML / HTML. Qui di seguito, come posso estrarre la stringa "41,8; 12.23" dal geo.position meta tag? Thx !!

Ecco il mio LINQ

   String longLat = (String)
        from el in xdoc.Descendants()
              where
               (string)el.Name.LocalName == "meta"
               & el.FirstAttribute.Name == "geo.position"
                select (String) el.LastAttribute.Value;

Ecco il mio XDocument

<span>
  <!--CTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dt -->
  <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
      <meta content="application/xhtml+xml; charset=utf-8" http-equiv="Content-Type" />
      <meta content="text/css" http-equiv="Content-Style-Type" />
      <meta name="geo.position" content="41.8;12.23" />
      <meta name="geo.placename" content="RomeFiumicino, Italy" />
      <title>RomeFiumicino, Italy</title>
    </head>
    <body />
  </html>
</span>

Edit: La mia domanda come dato restituisce nulla. La query "interna" sembra restituire un elenco di tutti gli elementi meta invece di quella elemento che voglio.

Modifica: La seguente query LINQ lavora contro lo stesso XDocument a prelevare una tabella con il nome class = "data"

    var dataTable =
        from el in xdoc.Descendants()
        where (string)el.Attribute("class") == "data"
        select el;
È stato utile?

Soluzione

Un span intorno al vostro tag html?

Si potrebbe fare questo con XLinq, ma sarebbe supportare solo XML ben formato. Si potrebbe desiderare di guardare il HTML Agility pacchetto .

Modifica - Questo funziona per me:

string xml = "...";
var geoPosition = XElement.Parse(xml).Descendants().
    Where(e => e.Name.LocalName == "meta" &&
        e.Attribute("name") != null &&
        e.Attribute("name").Value == "geo.position").
    Select(e => e.Attribute("content").Value).
    SingleOrDefault();

Altri suggerimenti

scommetterei che il problema che hai riscontrato deriva dal non fa riferimento lo spazio dei nomi correttamente con un XmlNamespaceManager. Qui ci sono due modi per farlo:

string xml =
        @"<span>
   <!--CTYPE html PUBLIC ""-//W3C//DTD XHTML 1.0 Transitional//EN""
        ""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dt -->
   <html xmlns=""http://www.w3.org/1999/xhtml"">
    <head>
     <meta content=""application/xhtml+xml; charset=utf-8"" http-equiv=""Content-Type"" />
      <meta content=""text/css"" http-equiv=""Content-Style-Type"" />
      <meta name=""geo.position"" content=""41.8;12.23"" />
      <meta name=""geo.placename"" content=""RomeFiumicino, Italy"" />
      <title>RomeFiumicino, Italy</title>
    </head>
    <body />
   </html>
    </span>";

    string ns = "http://www.w3.org/1999/xhtml";
    XmlNamespaceManager nsm;

    // pre-Linq:
    XmlDocument d = new XmlDocument();
    d.LoadXml(xml);
    nsm = new XmlNamespaceManager(d.NameTable);
    nsm.AddNamespace("h", ns);

    Console.WriteLine(d.SelectSingleNode(
        "/span/h:html/h:head/h:meta[@name='geo.position']/@content", nsm).Value);

    // Linq - note that you have to create an XmlReader so that you can
    // use its NameTable in creating the XmlNamespaceManager:
    XmlReader xr = XmlReader.Create(new StringReader(xml));
    XDocument xd = XDocument.Load(xr);
    nsm = new XmlNamespaceManager(xr.NameTable);
    nsm.AddNamespace("h", ns);

    Console.WriteLine(
        xd.XPathSelectElement("/span/h:html/h:head/h:meta[@name='geo.position']", nsm)
            .Attribute("content").Value);

Sono d'accordo con Thorarin - utilizzare il blocco HTML Agility, è molto più robusto

.

Tuttavia, ho il sospetto che il problema che si verifica utilizzando LinqToXML è a causa dello spazio dei nomi. Vedere MSDN qui per come gestirli nelle query.

" Se si dispone di XML che si trova in uno spazio dei nomi di default, è ancora necessario dichiarare una variabile XNamespace, e combinarlo con il nome locale per fare un nome qualificato per essere utilizzato nella query.

Uno dei problemi più comuni quando si interroga alberi XML è che se l'albero XML ha un namespace predefinito, lo sviluppatore a volte scrive la query come se l'XML non erano in uno spazio dei nomi ".

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top