【问题标题】:How to obtain inner tags value in XML?如何获取 XML 中的内部标签值?
【发布时间】:2012-02-26 07:22:54
【问题描述】:
XDocument coordinates = XDocument.Load("http://feeds.feedburner.com/TechCrunch");
System.IO.StreamWriter StreamWriter1 = new System.IO.StreamWriter(DestFile);
XNamespace nsContent = "http://purl.org/rss/1.0/modules/content/";
string pchild = null;

foreach (var item in coordinates.Descendants("item"))
{
   string link = item.Element("guid").Value;

   //string content = item.Element(nsContent + "encoded").Value;
   foreach (var child in item.Descendants(nsContent + "encoded"))
   {
      pchild = pchild + child.Element("p").Value;
   }

   StreamWriter1.WriteLine(link + Environment.NewLine +  Environment.NewLine + pchild + Environment.NewLine);
}

StreamWriter1.Close();

如果我使用注释行代码 (string content = item.Element(nsContent + "encoded").Value;) 而不是内部 for loop,它将获取 <conten:encoded> 元素的值,但它包含所有链接、图像等。我只想要文字。

为此,我尝试使用此过滤器(内部 for 循环),但显示错误:

对象引用未设置为对象的实例。

请给我建议代码,以便我可以只存储文本并删除所有其他链接、<img> 标签等。

【问题讨论】:

    标签: c# asp.net xml xml-parsing


    【解决方案1】:

    item.Element(nsContent + "encoded").Value 的内容是 html 而不是 xml。你应该相应地解析它,比如使用Html Agility Pack

    请看下面的例子

    string content = item.Element(nsContent + "encoded").Value;
    HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
    doc.Load(new StringReader(content));
    var text = String.Join(Environment.NewLine + Environment.NewLine,
                    doc.DocumentNode
                    .Descendants("p")
                    .Select(n => "\t" + System.Web.HttpUtility.HtmlDecode(n.InnerText))
                );
    

    【讨论】:

    • 对不起,Join 是我自己的扩展方法。我更新了答案
    【解决方案2】:

    首先,我将从使用 StringBuilder 开始:

    StringBuilder sb = new StringBuilder();
    

    然后,我怀疑有时,“child”没有“p”元素,所以你可以在使用前检查:

    foreach (var child in item.Descendants(nsContent + "encoded"))
    {
      if (child.Element("p") != null)
      {
        sb.Append(child.Element("p").Value);
      }
    }
    
    StreamWriter1.WriteLine(link + Environment.NewLine +  Environment.NewLine + sb.ToString() + Environment.NewLine);
    

    这对你有用吗?

    【讨论】:

    • 是的,这不起作用,因为您的所有

      元素都在 CDATA 节点内...这需要更多工作。

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多