2

次のような HTML 文字列を解析する必要があります。

<widget attribute="1">
  <header>
    <table>
  </header>
  <item>
    <tr><td>content</td></tr>
  </item>
  <footer>
    </table>
  </footer>
</widget>

私は Html Agility Pack を使用しており、すべての「ウィジェット」を見つけることができます。

HtmlDocument doc = new HtmlDocument();
doc.OptionAutoCloseOnEnd = false;
doc.OptionOutputAsXml = false;
doc.LoadHtml(htmlString); 
HtmlNodeCollection widgets = doc.DocumentNode.SelectNodes("//widget");

私の問題は、ウィジェット ノードのすべての子ノードを取得しようとするときです。HTMLAgility はすべてのタグを自動的に閉じるため、ヘッダー、アイテム、およびフッター ノードを正しく取得できません。Agility によって生成される出力は次のとおりです。

<header>
    <table>
</table></header>
<item>
    <tr>
        <td><p>Riga n.1</p></td>
    </tr>
</item>
<footer>

</footer>

ヘッダーの Table タグを閉じ、フッターの Table タグを非表示にします。これらのタグを閉じないままにする方法はありますか? LoadHtml メソッドのロジックに関するドキュメントを検索しようとしましたが、何も見つかりませんでした。オプションで遊ぶ必要があると思います。

手伝って頂けますか?

4

3 に答える 3

2

Html Agility Packは、通常、設計上重複するタグをサポートしていません。ただし、次のように微調整できます。

HtmlDocument doc = new HtmlDocument();
HtmlNode.ElementsFlags.Add("table", HtmlElementFlag.CanOverlap | HtmlElementFlag.Empty);
doc.LoadHtml(htmlString); 

この場合、TABLEを重複タグとして扱うようにライブラリに指示します。補足として、FORMはデフォルトで重複タグとして定義されている唯一のTAGです(ここで理由を参照してください:HtmlAgilityPack-<form>は何らかの理由でそれ自体を閉じますか?)。

ただし、これは無料のランチとしては提供されません...

つまり、ライブラリはテーブル内にあるものとテーブルタグを閉じるものを純粋なテキスト要素として認識します。したがって、解析されたテーブル内のすべてのタグにプログラムでアクセスできるわけではなく、DOMに表示されない、XPATHを使用して表示されないなど、必要に応じて十分な場合があります。

于 2013-02-25T06:57:43.027 に答える
0

HtmlAgilityPackはHTMLを解析します。これは完全に壊れたHTMLであるため、推測が必要です。ブラウザはこれ以上うまくいきません。たとえば、Firefoxはこれを次のように変換します。

<header>
<item> </item>
<footer> </footer>
<table>
<tbody>
<tr>
<td>content</td>
</tr>
</tbody>
</table>
</header>

壊れたHTMLを使用することで、実装固有の未定義の動作に自分自身を開放することになります。HTMLを修正して、世界に感覚を取り戻してください。

于 2013-02-24T14:57:01.723 に答える
0

<>これらのシンボルを値から削除する必要があります。そうすれば、次のことができXDocument.Parse()ます。

<widget attribute="1">
    <header>[table]</header>
    <item>[tr][td]content[/td][/tr]</item>
    <footer>[/table]</footer>
</widget>

あなたが読んだものだけ.Replace('[','<').Replace(']', '>')で、あなたは行ってもいいはずです。

System.Xml.Linq.XDocumentクラスに関するイタリア語のMSDNページはこちら

于 2013-02-25T07:58:09.037 に答える