Как получить значение внутренних тегов в XML? - PullRequest
0 голосов
/ 03 февраля 2012
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 ]

1 голос
/ 03 февраля 2012

Содержимое 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))
            );
0 голосов
/ 03 февраля 2012

Во-первых, я бы начал с использования 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);

Это работает для вас?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...