从 XElement 读取文本内容
Posted
技术标签:
【中文标题】从 XElement 读取文本内容【英文标题】:Read text content from XElement 【发布时间】:2012-10-05 13:59:09 【问题描述】:在 .NET 中,如何?
例如,来自 XElement
XElement.Parse("<tag>Alice & Bob<other>cat</other></tag>")
我想要字符串 'Alice & Bob'
我试过element.Value
,但返回的是'Alice & Bobcat' :(
【问题讨论】:
我很确定这是格式错误的 XML,这就是您遇到问题的原因。标签应该包含一个值或其他标签,而不是两者。<p>Perfectly normal for that popular XML language called <b>html</b></p>
实际上,HTML 不是 XML,反之亦然。当然,它们是相关的,但只有 XHTML 两者兼而有之。 en.wikipedia.org/wiki/XHTML。如果要解析 HTML,则应该使用 HTML 解析器。如果您正在解析 XML,我仍然认为这是错误的格式。
我不确定标准是否从现在到那时发生了变化,但按照当前标准,这是格式良好的 XML。 tag
节点有两个子节点,一个文本节点和一个元素节点。对于 DTD 或模式,问题确实会变得更加复杂,在这种情况下,可能无法准确指定这种格式。
@Bobson:这是有效的 xml,所以你不能仅仅因为你认为这是不好的做法就声明“格式错误的 xml”。
【参考方案1】:
XElement t = XElement.Parse("<tag>Alice & Bob<other>cat</other></tag>");
string s = (t.FirstNode as XText).Value;
【讨论】:
【参考方案2】:只是因为我最近有类似的要求,所以我提供:
var x = XElement.Parse("<tag>Alice & 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 & 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 & 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 & Bob<other>cat</other></tag>");
string s = t.toString();
【讨论】:
以上是关于从 XElement 读取文本内容的主要内容,如果未能解决你的问题,请参考以下文章
如何确定 XElement.Elements() 是不是包含具有特定名称的节点?