質問

特定のノードを保存するのが困難です (この場合、 <b>) LINQ to XML で XML を解析する場合。まず、次の LINQ クエリを使用してノードを取得します。

IEnumerable<XElement> node = from el in _theData.Descendants("msDict") select el;

これにより、次の XML が返されます (最初の XML として XElement)...

<msDict lexid="m_en_us0000002.001" type="core">
  <df>(preceding a numeral) <b>pound</b> or <b>pounds</b> (of money)
  <genpunc tag="df">.</genpunc></df>
</msDict>

次に、次のコードを使用してコンテンツを収集します。

StringBuilder output = new StringBuilder();
foreach (XElement elem in node)
{
    output.append(elem.Value);
}

ここが限界点です。XML ノードはすべて削除されますが、次のすべてのインスタンスを保持したいと考えています。 <b>. 。出力として次のものが得られることを期待しています...

(preceding a numeral) <b>pound</b> or <b>pounds</b> (of money).

注記:XSLT ではこれが簡単な操作であることはわかっていますが、LINQ to XML を使用してこれを行う簡単な方法があるかどうか知りたいです。

役に立ちましたか?

解決

「動作はしますが、面倒で、これに頼る必要があるとは信じられません」のカテゴリでは、次のようになります。

StringBuilder output = new StringBuilder();  
foreach (XElement elem in node)  
{  
    output.append(string.Join("", elem.Nodes().Select(n => n.ToString()).ToArray()));  
} 

個人的には、これは XElement の拡張メソッドを求めていると思います...

アップデート:すべての要素タグを除外したい場合 を除外する <b> その場合、再帰的メソッドを使用してノード値を返す必要があります。

メインのメソッド本体は次のとおりです。

StringBuilder output = new StringBuilder();
foreach (XElement elem in node)
{
    output.Append(stripTags(elem));
}

そして、これがstripTagsです:

private static string stripTags(XNode node)
{
    if (node is XElement && !((XElement)node).Name.ToString().Equals("b", StringComparison.InvariantCultureIgnoreCase))
    {
        return string.Join(string.Empty, ((XElement)node).Nodes().Select(n => stripTags(n)).ToArray());
    }
    else
    {
        return node.ToString();
    }
}

したがって、本当の答えは「いいえ、LINQ to XML を使用してこれを行う簡単な方法はない」です。 ある 方法...

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top