Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用LINQ to XML时保留某些节点_C#_Linq To Xml_Xelement - Fatal编程技术网

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

C# 使用LINQ to XML时保留某些节点,c#,linq-to-xml,xelement,C#,Linq To Xml,Xelement,在使用LINQ解析XML时,我很难保留某些节点(在本例中为)。我首先使用以下LINQ查询获取一个节点 IEnumerable node=从数据中的el。子体(“msDict”)选择el 它返回以下XML(作为第一个XElement) 这是突破点。所有XML节点都已剥离,但我希望保留的所有实例。我希望得到以下输出 (数字前)英镑或英镑(货币)。 注意:我知道这在XSLT中是一个简单的操作,但我想知道是否有一种简单的方法可以使用LINQtoXML实现这一点 在“它有效,但很混乱,我不敢相信我不得不求

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

IEnumerable node=从数据中的el。子体(“msDict”)选择el

它返回以下XML(作为第一个
XElement

这是突破点。所有XML节点都已剥离,但我希望保留
的所有实例。我希望得到以下输出

(数字前)英镑或英镑(货币)。

注意:我知道这在XSLT中是一个简单的操作,但我想知道是否有一种简单的方法可以使用LINQtoXML实现这一点

在“它有效,但很混乱,我不敢相信我不得不求助于此”的类别中:

就我个人而言,我认为这需要一种对XElement的扩展方法

更新: 如果要排除所有元素标记,则需要使用递归方法返回节点值

以下是您的主要方法主体:

StringBuilder output = new StringBuilder();
foreach (XElement elem in node)
{
    output.Append(stripTags(elem));
}
下面是条纹标签:

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并不是一种简单的方法,但有一种方法…

我得到了一个语法错误:参数类型“Systems.Collections.Generic.IEnumerable”不能分配给参数类型“string[]”啊。如果未使用.Net 4,则需要添加.ToArray()。我将更新以使其更具通用性。使用您的方法,我将获得“(在数字之前)英镑或英镑(货币)。”。我想保留,但不是。用你的方法有没有办法达到这种行为?啊。这更为复杂。您需要向一个方法添加一个递归调用,该方法标识节点是否为XElement,如果是,则标识它是否为XElement。更难,但不是不可能。对我的情况来说,这很有魅力。非常感谢你!
StringBuilder output = new StringBuilder();  
foreach (XElement elem in node)  
{  
    output.append(string.Join("", elem.Nodes().Select(n => n.ToString()).ToArray()));  
} 
StringBuilder output = new StringBuilder();
foreach (XElement elem in node)
{
    output.Append(stripTags(elem));
}
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();
    }
}