如何在XML中获取内部标签值?

时间:2012-02-03 17:17:03

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

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>元素的值,但它包含所有链接,图像等等。我只想要文字。

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

  

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

请为我建议代码,以便我只能存储文字并删除所有其他链接,<img>标记等。

2 个答案:

答案 0 :(得分: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))
            );

答案 1 :(得分:0)

首先,我将首先使用StringBuilder:

StringBuilder sb = new StringBuilder();

然后,我怀疑有时候,“孩子”没有“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);

这对你有用吗?