在使用 LINQ to XML 解析 XML 时,我很难保留某些节点(在本例中为 <b>
)。我首先使用以下 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 执行此操作的简单方法。
最佳答案
在“它有效但很乱,我不敢相信我必须求助于此”的类别中:
StringBuilder output = new StringBuilder();
foreach (XElement elem in node)
{
output.append(string.Join("", elem.Nodes().Select(n => n.ToString()).ToArray()));
}
就我个人而言,我认为这需要 XElement 上的扩展方法...
更新: 如果你想排除所有元素标签 except 那么你需要使用递归方法来返回节点值。
这是你的主要方法体:
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 来做到这一点,但是有一种方法...
关于c# - 使用 LINQ to XML 时保留某些节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4037856/