Question

Je suis en train d'analyser un bit de données à partir d'un fichier HTML, mais ma déclaration LINQ ne fonctionne pas. Voici le XML / HTML. Ci-dessous, comment puis-je extraire la chaîne « 41,8; 12,23 » de la balise meta geo.position? Thx !!

Voici mon 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;

Voici mon 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: Ma requête comme ne renvoie rien donné. La requête « intérieure » semble renvoyer une liste de tous les éléments meta au lieu de simplement l'un des éléments que je veux.

Edit: La requête Linq suivante fonctionne sur le même XDocument à une table retreive avec le nom de class = "data"

    var dataTable =
        from el in xdoc.Descendants()
        where (string)el.Attribute("class") == "data"
        select el;
Était-ce utile?

La solution

A span autour de votre balise html?

Vous pouvez le faire avec XLinq, mais il ne soutiendrons XML bien formé. Vous pouvez regarder le HTML Agility pack à la place.

Modifier - Cela fonctionne pour moi:

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();

Autres conseils

Je serais prêt à parier que le problème que vous rencontrez est de ne pas référencer correctement l'espace de noms avec un XmlNamespaceManager. Voici deux façons de le faire:

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);

Je suis d'accord avec Thorarin - utiliser le pack Agility HTML, il est beaucoup plus robuste

.

Cependant, je soupçonne que le problème que vous rencontrez à l'aide LinqToXML est à cause de l'espace de noms. Voir MSDN ici pour savoir comment les gérer dans vos requêtes.

» Si vous avez XML qui se trouve dans un espace de noms par défaut, vous devez quand même déclarer une variable XNamespace, et le combiner avec le nom local de faire un nom qualifié pour être utilisé dans la requête.

L'un des problèmes les plus fréquents lors de l'interrogation des arbres XML est que si l'arbre XML est un espace de noms par défaut, le développeur écrit parfois la requête comme si le XML était pas dans un espace de noms. "

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top