如何在XML中获取<p>元素值?</p>

时间:2012-02-04 03:08:51

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

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/";
foreach (var item in coordinates.Descendants("item"))
{
   string link = item.Element("guid").Value;
   string content = item.Element(nsContent + "encoded").Value; //It gets all links, images etc 
}

StreamWriter1.Close();

使用此我可以获得guid元素值以及content:encoded值,但content:encoded元素的值会获取所有链接,标记,

标记等

但我只想要文本...意味着我只需要简单文本数据,而不需要获取任何img链接,链接等。

如何解析XML中的<p>..</p>标记数据? 请建议 感谢

3 个答案:

答案 0 :(得分:2)

您在该XML文档中嵌入了HTML。最安全的做法是获取HTML并使用HTML解析器(例如HTML Agility Pack)解析它并从那里开始。它应该没有那么大的不同。请注意HTML仍然有点编码,所以你必须先解码它。

const string url = "http://feeds.feedburner.com/TechCrunch";
var doc = XDocument.Load(url);
var items = doc.Descendants("item");
XNamespace nsContent = "http://purl.org/rss/1.0/modules/content/";
foreach (var item in items)
{
    var encodedContent = (string)item.Element(nsContent + "encoded");
    var decodedContent = System.Net.WebUtility.HtmlDecode(encodedContent);
    var html = new HtmlDocument();
    html.LoadHtml(decodedContent);
    var ps = html.DocumentNode.Descendants("p");
    foreach (var p in ps)
    {
        var textContent = p.InnerText;
        // do something with textContent
    }
}

不幸的是,HTML似乎不是格式良好的XML,因此您将无法使用LINQ to XML。

答案 1 :(得分:1)

使用xpath,例如:

//p

应该为xpath查询执行此操作。您正在使用的图书馆Here's a link

答案 2 :(得分:0)

确定内容字符串后,您有以下几种选择:

  1. 使用正则表达式隔离并删除标记内的任何内容。这将从文本中删除所有标签,并且(理论上)只留下您感兴趣的文本。
  2. 解析文本本身并构造文本输出。我在PowerShell脚本(https://github.com/joelmartinez/PowerShell-Bits/blob/master/GetTextFromHtml.ps1)中做了类似的事情。我使用HtmlAgilityPack将一些HTML加载到dom中,然后遍历dom树以提取文本节点。