2017-04-13 68 views
0

我試圖解析XML RSS提要需要的日期從這個轉變中的一個元素:如何使用C#替換Xml字符串中的日期?

<lastBuildDate>Thu, 13 Apr 2017</lastBuildDate>

這樣:

<lastBuildDate>Thu, 13 Apr 2017 09:00:52 +0000</lastBuildDate>

我能弄個具有以下代碼的lastBuildDate元素

XmlTextReader reader = new XmlTextReader(rssFeedUrl); 
while (reader.Read()) 
{ 
    if (reader.NodeType == XmlNodeType.Element && reader.Name.Contains("BuildDate")) 
    { 
    // replace DateTime format 
    } 
} 

我不知道如何獲取元素&中的文本的值,然後用正確的格式替換它 - 任何人都可以幫忙嗎?

+0

爲什麼不解析整個事情,找到元素,更換'innerText',並重新字符串化?或不要restringify;你在做什麼? –

+0

你應該使用'XElement';這很容易。 – SLaks

+0

我已經更新了我的主題標題,我不需要使用XmlTextReader。你能告訴我如何以任何方式做到這一點? –

回答

1

我建議使用LINQ to XML,這是一個好得多的API:

var doc = XDocument.Load(rssFeedUrl); 

var lastBuildDate = doc.Descendants("lastBuildDate").Single(); 

var lastBuildDateAsDateTime = (DateTime) lastBuildDate; 

lastBuildDate.Value = "new value here"; // perhaps based on lastBuildDateAsDateTime above 

// get XML string with doc.ToString() or write with doc.Save(...) 

了工作演示見this fiddle

1

這是怎麼了。我喜歡XmlDocument。還有其他方法,但這會讓你走。

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Xml; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
    public static void Main() 
     { 
      XmlDocument doc = new XmlDocument(); 
      doc.LoadXml("<?xml version='1.0' encoding='UTF-8' standalone='no'?><root><lastBuildDate>Thu, 13 Apr 2017</lastBuildDate></root>"); 

      XmlNodeList list = doc.GetElementsByTagName("lastBuildDate"); 

      foreach(XmlNode node in list) 
      { 
       DateTime result = new DateTime(); 
       if (DateTime.TryParse(node.InnerXml, out result)) 
       { 
        node.InnerText = result.ToString("ddd, d MMM yyyy HH:mm:ss") + "+0000"; //Thu, 13 Apr 2017 09:00:52 +0000 
       } 
      } 
      using (var stringWriter = new StringWriter()) 
      using (var xmlTextWriter = XmlWriter.Create(stringWriter)) 
      { 
       doc.WriteTo(xmlTextWriter); 
       xmlTextWriter.Flush(); 
       Console.Write(stringWriter.GetStringBuilder().ToString()); 
      } 
     } 
    } 
}