从 XElement 读取文本内容

Posted

技术标签:

【中文标题】从 XElement 读取文本内容【英文标题】:Read text content from XElement 【发布时间】:2012-10-05 13:59:09 【问题描述】:

在 .NET 中,如何?

例如,来自 XElement

XElement.Parse("<tag>Alice &amp; Bob<other>cat</other></tag>")

我想要字符串 'Alice & Bob'


我试过element.Value,但返回的是'Alice & Bobcat' :(

【问题讨论】:

我很确定这是格式错误的 XML,这就是您遇到问题的原因。标签应该包含一个值或其他标签,而不是两者。 &lt;p&gt;Perfectly normal for that popular XML language called &lt;b&gt;html&lt;/b&gt;&lt;/p&gt; 实际上,HTML 不是 XML,反之亦然。当然,它们是相关的,但只有 XHTML 两者兼而有之。 en.wikipedia.org/wiki/XHTML。如果要解析 HTML,则应该使用 HTML 解析器。如果您正在解析 XML,我仍然认为这是错误的格式。 我不确定标准是否从现在到那时发生了变化,但按照当前标准,这是格式良好的 XML。 tag 节点有两个子节点,一个文本节点和一个元素节点。对于 DTD 或模式,问题确实会变得更加复杂,在这种情况下,可能无法准确指定这种格式。 @Bobson:这是有效的 xml,所以你不能仅仅因为你认为这是不好的做法就声明“格式错误的 xml”。 【参考方案1】:
 XElement t = XElement.Parse("<tag>Alice &amp; Bob<other>cat</other></tag>");
 string s = (t.FirstNode as XText).Value;

【讨论】:

【参考方案2】:

只是因为我最近有类似的要求,所以我提供:

var x = XElement.Parse("<tag>Alice &amp; Bob<other>cat</other></tag>")
var text = string.Concat(x.Nodes().OfType<XText>().Select(t => t.Value));

不会捕获子节点的文本内容,但会连接当前元素中所有未标记的文本节点。

【讨论】:

这是最灵活\通用且因此有用的答案。 这但没有 concat 很棒。 concat 只会合并字符串并使结果不明确。【参考方案3】:

试试下面的代码可能对你有帮助..

namespace ConsoleApplication6

    class Program
    
        static void Main(string[] args)
        
            var parent = XElement.Parse("<tag>Alice &amp; Bob<other>cat</other></tag>");
            var nodes = from x in parent.Nodes()
                            where x.NodeType == XmlNodeType.Text
                            select (XText)x;

            foreach (var val in nodes)
            
                Console.WriteLine(val.Value);
            
            Console.ReadLine();
        
    

【讨论】:

【参考方案4】:

使用element.FirstNode,您可以获得元素“Alice & Bob”中的原始内容,因此您只需“取消转义”与符号即可获得预期的结果。

【讨论】:

【参考方案5】:
XElement t= XElement.Parse("<tag>Alice &amp; Bob<other>cat</other></tag>");
string s = t.FirstNode.ToString();

【讨论】:

尝试使用这个字符串 s = System.Web.HttpUtility.HtmlDecode((string.Format(t.FirstNode.ToString())));确保引用了 System.Web Dll。 你也可以使用它 string s = System.Net.WebUtility.HtmlDecode((string.Format(t.FirstNode.ToString()))); 但这也有效。转义的特殊字符没有理由拒绝投票。【参考方案6】:
XElement t= Xelement.Parse("<tag>Alice &amp; Bob<other>cat</other></tag>");
string s = t.toString();

【讨论】:

以上是关于从 XElement 读取文本内容的主要内容,如果未能解决你的问题,请参考以下文章

使用动态特性读取 XML 结构

如何从XElement获取标签

如何确定 XElement.Elements() 是不是包含具有特定名称的节点?

c# Elements of elements using XElement

XElement 的子级

XML文件内容如何读取(C或C++)