5

XML/HTML 解析は初めてです。重複を適切に検索するための正しい単語さえ知りません。

次のような HTML ファイルがあります。

<body id="s1" style="s1">
    <div xml:lang="uk">
        <p begin="00:00:00" end="00:00:29">
          <span fontFamily="SchoolHouse Cursive B" fontSize="18">I'm great!</span>
        </p>

00:00:00、私は00:00:29それI'm great!から必要です。私はそれを次のように読むことができました:

XmlTextReader reader = new XmlTextReader(file);
while (reader.Read())
{
    if (reader.NodeType != XmlNodeType.Element)
        continue;

    if (reader.LocalName != "p")
        continue;

    var a = reader.GetAttribute(0);
    var b = reader.GetAttribute(1);

    if (reader.LocalName == "span")
    {
        XmlDocument doc = new XmlDocument();
        doc.Load(reader);
        XmlNode elem = doc.DocumentElement.FirstChild;
        var c = elem.InnerText;
    }
 }

変数abおよびで値を取得しますc。ただし、HTML 形式に若干の変更がありました。HTML は次のようになります。

<body id="s1" style="s1">
  <div xml:lang="uk">
      <p begin="00:00:00" end="00:00:29">I'm great! </p>

このシナリオでは、どのように00:00:00, 00:00:29andを解析しI'm great!ますか? 私はこれを試しました:

XmlTextReader reader = new XmlTextReader(file);
while (reader.Read())
{
    if (reader.NodeType != XmlNodeType.Element)
        continue;

    if (reader.LocalName != "p")
        continue;

    var a = reader.GetAttribute(0);
    var b = reader.GetAttribute(1);

    XmlDocument doc = new XmlDocument();
    doc.Load(reader);
    XmlNode elem = doc.DocumentElement.FirstChild;
    var c = elem.InnerText;
}

しかし、次のエラーが表示されます: This document already has a 'DocumentElement' node.at line doc.Load(reader). 正しく読む方法と問題の原因は何ですか? .NET 2.0 を使用しています

4

2 に答える 2

6

XML パーサーで解析したい HTML があるようです。それが例外を受け取る理由かもしれませんThis document already has a 'DocumentElement' node.: HTML では許可されていますが、XML では許可されていない複数のルート ノードがあるためです。

代わりに HTML パーサーを使用してください。残念ながら、.NET フレームワークには何も組み込まれていません。そのためには、サードパーティのライブラリを使用する必要があります。非常に優れているのは、oleksii がコメントで既に言及したHTML agility packです。

編集:

あなたのコメントから、HTML と XML の間に直接的な関係がないという事実に慣れていないように感じます。ここから取得した図は、これを非常によく示しています。

SGML、HTML、XMLの関係

XML は HTML のサブセットではなく、その逆でもありません。厳密な XHTML を使用している場合にのみ (まれなケースですが)、XML パーサーで解析できる HTML ドキュメントが得られます。ただし、このような XHTML ドキュメントのコードに誤りがあると、パーサーは失敗しますが、一般的なブラウザーでは引き続きページが表示されます。また、XHTML の将来は非常に不透明です。現在、HTML5 はゆっくりとではあるが着実に実用化されつつあります...

要約すると、これらすべての落とし穴を回避するには、簡単な方法で HTML パーサーを使用してください。

于 2012-06-30T20:29:23.947 に答える
3

HTML を解析したいので、WebClient(またはWebBrowser) を使用してページをロードし、HTML DOM を使用してページをナビゲートできます。Microsoft HTML Object Library次のコード例では、(COM) への参照を追加する必要があります。

  string html;
  WebClient webClient = new WebClient();
  using (Stream stream = webClient.OpenRead(new Uri("http://www.google.com")))
  using (StreamReader reader = new StreamReader(stream))
  {
    html = reader.ReadToEnd();
  }
  IHTMLDocument2 doc = (IHTMLDocument2)new HTMLDocument();
  doc.write(html);
  foreach (IHTMLElement el in doc.all)
    Console.WriteLine(el.tagName);

以前、HTML を XML に読み込もうとしたことがありますが、非常に困難でした。閉じられていないタグ (<BR> など) を修正したり、属性を引用符で囲んだり、値のない属性に値を与えたりするなどです。それに対して XSLT を使用したかったので、 HTML DOM にロードしてナビゲートした後、各 HTML ノードに関連する XML ノードを作成します。次に、HTML の適切な XML 表現を取得しました。

于 2012-07-01T05:26:24.383 に答える