5

LINQtoXMLを使用してhtmlを抽出しているxmlファイルがあります。これはファイルのサンプルです:

<?xml version="1.0" encoding="utf-8" ?>
<tips>
    <tip id="0">
    This is the first tip.
</tip>
<tip id="1">
    Use <b>Windows Live Writer</b> or <b>Microsoft Word 2007</b> to create and publish content.
</tip>
<tip id="2">
    Enter a <b>url</b> into the box to automatically screenshot and index useful webpages.
</tip>
<tip id="3">
    Invite your <b>colleagues</b> to the site by entering their email addresses.  You can then share the content with them!
</tip>
</tips>

次のクエリを使用して、ファイルから「ヒント」を抽出しています。

Tip tip = (from t in tipsXml.Descendants("tip")
                   where t.Attribute("id").Value == nextTipId.ToString()
                   select new Tip()
                   {
                     TipText= t.Value,
                     TipId = nextTipId
                   }).First();

私が抱えている問題は、Html要素が削除されていることです。Valueの代わりにInnerHtmlのようなものを使用することを望んでいましたが、それは存在しないようです。

何か案は?

よろしくお願いします。

デイブ

4

4 に答える 4

8

t.ToString()の代わりに呼び出しますValue。これにより、XML が文字列として返されます。SaveOptions を取るオーバーロードを使用して、書式設定を無効にすることができます。今は確認できませんが、要素タグ (および要素) が含まれていると思われるので、これを取り除く必要があります。

HTML が有効な XML でない場合、全体的に無効な XML ファイルになることに注意してください。

XML ファイルの形式は完全に制御不能ですか? 内部の HTML を XML でエンコードした方がよいでしょう。

編集:外側の部分を取得することを回避する1つの方法は、次のようなことを行うことです(もちろん、クエリから呼び出される別のメソッドで):

StringBuilder builder = new StringBuilder();
foreach (XNode node in element.Nodes())
{
    builder.Append(node.ToString());
}

そうすれば、子孫と散在するテキスト ノードを含む HTML 要素を取得できます。基本的に、これは InnerXml と同等であると私は強く疑っています。

于 2009-01-19T15:36:08.293 に答える
1

string.Concat(tip.Nodes()) htmlタグでコンテンツを取得するために使用するだけです

于 2011-02-24T09:43:23.387 に答える
0

TipText= t.Value,

XElement.valueは、要素のすぐ内側にあるテキストのみを返します。ネストされた要素 (HTML など) 内のテキストは含まれず、もちろん &-entity-references はデコードされた形式で表示されます。

コンテンツをマークアップ付きの文字列として取得したい場合は、おそらく SaveOptions.DisableFormatting を使用して、XElement.ToString() を呼び出すことができます。ただし、これにはラッピング < tip> 要素が含まれていることに注意してください。つまり、Web ブラウザーの DOM 用語では、innerHTML ではなく、outerHTML です。innerHTML を取得するには、子 XElement.Node のすべての ToString() を結合する必要があります。

于 2009-01-19T15:51:51.290 に答える