0

HTML ファイルから少しのデータを解析しようとしていますが、Linq ステートメントが機能しません。これが XML/HTML です。以下で、geo.position メタ タグから文字列 "41.8;12.23" を抽出するにはどうすればよいですか? どうも!!

これが私の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;

これが私の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>

編集:与えられた私のクエリは何も返しません。「内部」クエリは、必要な 1 つの要素だけでなく、すべてのメタ要素のリストを返すようです。

編集: 次の Linq クエリは、同じ XDocument に対して機能し、クラス名 = "data" のテーブルを取得します。

    var dataTable =
        from el in xdoc.Descendants()
        where (string)el.Attribute("class") == "data"
        select el;
4

3 に答える 3

4

あなたのタグのspan周り?html

XLinq を使用してこれを行うこともできますが、整形式の XML しかサポートされません。代わりに、 HTML Agility Packを参照することをお勧めします。

編集- これは私にとってはうまくいきます:

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();
于 2009-08-21T18:33:24.310 に答える
3

あなたが抱えている問題は、. で名前空間を正しく参照していないことが原因だと思いますXmlNamespaceManager。これを行うには、次の 2 つの方法があります。

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);
于 2009-08-21T18:56:50.473 に答える
1

Thorarinに同意します-HTMLAgilityパックを使用すると、はるかに堅牢になります。

ただし、LinqToXMLを使用している問題は、名前空間が原因であると思われます。クエリでそれらを処理する方法については、MSDNを参照してください。

「デフォルトの名前空間にあるXMLがある場合でも、XNamespace変数を宣言し、それをローカル名と組み合わせて、クエリで使用する修飾名を作成する必要があります。

XMLツリーをクエリする際の最も一般的な問題の1つは、XMLツリーにデフォルトの名前空間がある場合、開発者がXMLが名前空間にないかのようにクエリを書き込むことがあることです。」

于 2009-08-21T18:46:44.567 に答える