3

<b>在使用 LINQ to XML 解析 XML 时,我很难保留某些节点(在这种情况下)。我首先使用以下 LINQ 查询获取一个节点...

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

它返回以下 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 的简单方法来执行此操作。

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 回答