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

在 .NET 中,如何从 XElement 读取文本内容?

例如,来自 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”。

标签: c# .net xml linq xelement


【解决方案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();
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-05-10
          • 1970-01-01
          • 2010-12-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-23
          • 1970-01-01
          相关资源
          最近更新 更多