使用 LINQ to XML 时保留某些节点

发布于 2024-09-29 05:44:11 字数 883 浏览 2 评论 0原文

在使用 LINQ to XML 解析 XML 时,我很难保留某些节点(在本例中为 )。我首先使用以下 LINQ 查询获取一个节点...

IEnumerable; 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 节点都被删除,但我想保留 的所有实例。我期望得到以下输出...

(前面是数字) (金钱)。

注意:我知道这是 XSLT 中的一个简单操作,但我想知道是否有一种简单的方法可以使用 LINQ to XML 来执行此操作。

I am having difficulty preserving certain nodes (in this case <b>) when parsing XML with LINQ to XML. I first grab a node with the following LINQ query...

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

Which returns the following XML (as the first 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>

I then collect the content with the following code...

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

Here's the breaking point. All of the XML nodes are stripped, but I want to preserve all instances of <b>. I am expecting to get the following as output...

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

Note: I know that this is a simple operation in XSLT, but I would like to know if there an easy way to do this using LINQ to XML.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

被你宠の有点坏 2024-10-06 05:44:11

在“它有效,但很混乱,我不敢相信我必须求助于这个”类别中:

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

就我个人而言,我认为这迫切需要 XElement 上的扩展方法...

更新:
如果您想排除除之外的所有元素标签 那么您需要使用递归方法来返回节点值。

这是您的主要方法主体:

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 来执行此操作,但是有一种方法...

In the category of "it works but it's messy and I can't believe I have to resort to this":

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

Personally, I think this cries out for an extension method on XElement...

UPDATE:
If you want to exclude all element tags except <b> then you'll need to use a recursive method to return node values.

Here's your main method body:

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

And here's 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();
    }
}

So the real answer is that no, there isn't an easy way to do this using LINQ to XML, but there's a way...

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文