2012-06-30 16 views
5

私はXML/HTML解析を初めて行っています。重複を適切に検索するための正しい言葉を知らない。HTMLノードの値を読み取る

私はこのようになります。このHTMLファイルがあります。今、私はそれから00:00:0000:00:29I'm great!が必要

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

を。私はこのようにそれを読むことができる:

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

私は変数abcの値を取得します。しかし、HTML形式には若干の変更がありました。私は00:00:0000:00:29I'm great!を解析んどのようにこのシナリオでは

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

今、HTMLは次のようになりますか?

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

しかし、私はこのエラーを取得:私はこれを試してみましたラインdoc.Load(reader)This document already has a 'DocumentElement' node.を。どのように正しく読んで、何が問題を引き起こしている?私は.NET 2.0を使用しています

+2

[html agility pack](https://htmlagilitypack.codeplex.com/)を見て、htmlを解析する必要があるようです。 – oleksii

+2

HTML!= XML .... –

+0

@oleksii System.Xmlの下にたくさんのサードパーティのlibを使用するべきですか?また、私は何もHTMLに関連する何もしていない – nawfal

答えて

6

XMLパーサーで解析するHTMLがあるようです。これは、This document already has a 'DocumentElement' node.例外を取得する理由でもあります.1つ以上のルートノードがあるためです(HTMLでは許可されているか、または許容されていますが、XMLでは許可されていません)。

代わりにHTMLパーサを使用してください。不幸にも、.NETフレームワークには何も組み込まれていません。あなたはそれのためにサードパーティライブラリを取らなければなりません。非常に良いものはHTML agility packです、彼はすでに彼のコメントで述べたoleksiiです。

編集:

あなたのコメントから、私はHTMLとXMLの間には直接関係がないという事実と自分の慣れていない感じてもらいます。

Relation between SGML, HTML and XML

をどちらもXMLはHTMLのサブセットで、また他の方法で回避され:hereから取られたグラフィックは非常によくこれを示していません。厳密なXHTML(まれにしかありません)がある場合のみ、XMLパーサーで解析できるHTMLドキュメントがあります。しかし、そのようなXHTML文書のコードに何らかの間違いがあると、パーサーは失敗し、共通のブラウザーはページを表示し続けます。は、これらすべての落とし穴を避けるために、簡単な道を取ると、HTMLパーサのために行く:また、XHTMLの未来はHTML5が

は、要約すると...ゆっくりと、しかし着実に人生に来ていることを、今、非常に不明瞭です。

+0

.NET XMLクラスを使用して解析することはできません。 – nawfal

+0

いいえ、不幸なことではありません。 HTMLはXMLのサブセットではありません。また、HTMLパーサー(ブラウザでも使用されているパーサー)は、無効な入力を解析する際に、より多くの寛容さがあるため、Webサイト用の無効なHTMLを書き始めるか、妥当性について気にしませんでした。しかし、XMLパーサーは、厳密には有効な*入力を期待しています。もしそうでなければ、あなたが見たように構文解析をやめ、例外をスローします。 –

+0

ありがとうフィリップ、私は理解して – nawfal

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

は私が前にXMLにロードするHTMLを試みたが、そのすべてあまりにもハードいる - 閉じられていないタグを固定(のような< BR>)、属性を引用符で囲み、値のない属性に値などを与えます。HTML DOMにロードしてから、各HTMLノードに関連するXMLノードを作成してナビゲートした後、XSLTを使用したいと思っていました。それから、私はHTMLの適切なXML表現を持っていました。

関連する問題