LINQ to XML を使用するときに特定のノードを保持する
-
27-09-2019 - |
質問
特定のノードを保存するのが困難です (この場合、 <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 を使用してこれを行う簡単な方法はない」です。 ある 方法...
所属していません StackOverflow