3

<b>XMLをLINQtoXMLで解析するときに、特定のノード(この場合)を保持するのに問題があります。最初に、次の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での単純な操作であることは知っていますが、LINQtoXMLを使用してこれを行う簡単な方法があるかどうかを知りたいと思います。

4

1 に答える 1

3

「それは機能しますが、それは厄介で、私はこれに頼らなければならないことを信じることができません」のカテゴリーで:

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を使用してこれを行う簡単な方法はありませんが、方法はあります...

于 2010-10-27T22:37:27.093 に答える