如何从xml文件中只读取文本行,并从xml文件中解析日期和时间?

问题描述:

在这段代码中,我使用InnerText来仅查看xml文件中没有任何标签的文本。 但我想两件事情改变现在:如何从xml文件中只读取文本行,并从xml文件中解析日期和时间?

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.Xml; 

namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      string xmlString = @"d:\adilipman1937067724.xml"; 

      XmlDocument doc = new XmlDocument(); 
      doc.Load(xmlString); 
      string t = doc.InnerText; 
      textBox1.Text = t; 
     } 
    } 
} 
  1. 为了解析文本行。

  2. 解析并添加到每行的日期和时间。

这里是我想从解析XML文件的例子:

FriendlyName="[email protected]"/></To><Text Style="font-family:Segoe UI; color:#000000; ">testing the test.</Text></Message><Message Date="31/01/2012" Time="10:15:58" DateTime="2012-01-31T08:15:58.897Z" SessionID="1"><From><User FriendlyName="Chocolade"/></From><To><User 

而是放在一个字符串只有文本“试考”我希望它是格式在textBox1像:

adilipman 10:15:58 31/01/2012 testing the test  

这是一条线。 下一行是例如:

adilipman 10:15:59 31/01/2012 testing the test was ok 

但现在就是这样什么即时得到在textBox1的:

testing the test testing the test was ok 

从XML文件中的一些更多的文字:

<?xml version="1.0"?> 
<?xml-stylesheet type='text/xsl' href='MessageLog.xsl'?> 
<Log FirstSessionID="1" LastSessionID="2"><Message Date="31/01/2012" Time="10:15:42" DateTime="2012-01-31T08:15:42.467Z" SessionID="1"><From><User FriendlyName="Chocolade"/></From><To><User FriendlyName="[email protected]"/></To><Text Style="font-family:Segoe UI; color:#000000; ">היי</Text></Message><Message Date="31/01/2012" Time="10:15:55" DateTime="2012-01-31T08:15:55.097Z" SessionID="1"><From><User FriendlyName="Chocolade"/></From><To><User FriendlyName="[email protected]"/></To><Text Style="font-family:Segoe UI; color:#000000; ">הייתה לי בעיה עם התוכנת ברקים אבל עכשיו הכל עובד.</Text></Message><Message Date="31/01/2012" Time="10:15:58" DateTime="2012-01-31T08:15:58.897Z" SessionID="1"><From><User FriendlyName="Chocolade"/></From><To><User FriendlyName="[email protected]"/></To><Text Style="font-family:Segoe UI; color:#000000; ">מה השלב הבא ?</Text></Message><Message Date="31/01/2012" Time="10:16:27" DateTime="2012-01-31T08:16:27.775Z" SessionID="1"><From><User FriendlyName="Chocolade"/></From><To><User FriendlyName="[email protected]"/></To><Text Style="font-family:Segoe UI; color:#000000; ">אמרת לי בזמנו לחשב ממוצע של 1000 ערכים ? הכוונה 1000 ערכים בפריים ? כי בפריים יש 256 מספרים לא ?</Text></Message><Message Date="31/01/2012" Time="10:17:03" DateTime="2012-01-31T08:17:03.405Z" SessionID="1"><From><User FriendlyName="[email protected]"/></From><To><User FriendlyName="Chocolade"/></To><Text Style="font-family:Segoe UI; color:#000000; ">לחשב ממוצע של 1000 הערכים הגבוהים ביותר בהיסטוגרמה</Text></Message><Message Date="31/01/2012" Time="10:17:10" DateTime="2012-01-31T08:17:10.405Z" SessionID="1"><From><User FriendlyName="[email protected]"/></From><To><User FriendlyName="Chocolade"/></To><Text Style="font-family:Segoe UI; color:#000000; ">ז"א בפריים</Text></Message><Message Date="31/01/2012" Time="10:17:14" DateTime="2012-01-31T08:17:14.135Z" SessionID="1"><From><User FriendlyName="[email protected]"/></From><To><User FriendlyName="Chocolade"/></To><Text Style="font-family:Segoe UI; color:#000000; ">לא בהיסטוגרמה</Text></Message><Message Date="31/01/2012" Time="10:17:20" DateTime="2012-01-31T08:17:20.142Z" SessionID="1"><From><User 
+0

您尝试发布XML失败;它只是部分存在(没有开放元素,部分结束元素)。起初我认为这只是格式不正确,但实际上并不存在于你的问题中。你应该编辑来解决这个问题,因为很难说出你需要改变而没有它。 –

+0

肯如何发布的XML然后?该文件是492kb我不会发布所有的文件内容。 –

+1

因此,即使您需要手动复制或自己写,也可以发一小段。 –

有有很多不同的方法来解析XML文档...使用XmlDocument,XmlTextReader s,但我更喜欢使用Linq到xml类来解析现有的xml文档,但如果我有创建我的XML文档,然后解析它,我更喜欢使用序列化。我比我更喜欢,我不知道你是从哪里得到这个XML文件?你是自己制作的吗?如果是,则应使用xml序列化将自己的对象保存为xml并反序列化以将其读回。这比解析xml文档要容易得多。

这里与你相似的问题一个最简单的例子: 我可以从你的XML例子明白......我用这个XML片段:

<Message Date="31/01/2012" 
     Time="10:15:58" 
     DateTime="2012-01-31T08:15:58.897Z" 
     SessionID="1"> 
     <From> 
       <User FriendlyName="Chocolade"/> 
     </From> 
     <To> 
       <User FriendlyName="[email protected]"/> 
     </To> 
     <Text >testing the test.</Text> 
</Message> 

您应该创建日期时间,SessionID的消息类,从,到和文本字段。喜欢的东西:

[Serializable] 
public class User 
{ 
     public string FriendlyName { get; set; } 
} 

[Serializable] 
public class Message 
{ 
     public string Text { get; set; } 
     public DateTime DateTime { get; set; } 
     public int SessionID { get; set; } 
     public User Form { get; set; } 
     public User To { get; set; } 
} 

[Serializable]属性是必需的编译器知道你的类型(消息)可以被序列化。创建类xml结构后,您可以序列化您的Message的任何实例或其中的前夕阵列List<Message>。你应该这样做下一篇:

private void button1_Click(object sender, EventArgs e) 
{ 
string xmlToSerializePath = @"c:/temp/stackowrflowquestionxml.xml"; 

XmlSerializer serializer = new XmlSerializer(typeof(Message)); 
StreamWriter writer = new StreamWriter(xmlToSerializePath); 

Message messageToSerialize = new Message 
            { 
             DateTime = new DateTime(2012, 1, 31, 8, 15, 58), 
             Form = new User() 
                { 
                 FriendlyName = "Chocolade" 
                }, 
             To = new User 
                { 
                 FriendlyName = "[email protected]" 
                }, 
             SessionID = 1, 
             Text = "testing the test." 
            }; 
     serializer.Serialize(writer, messageToSerialize); 
     writer.Close(); 
} 

您将获得下一个XML文档:

<?xml version="1.0" encoding="utf-8"?> 
<Message xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Text>testing the test.</Text> 
    <DateTime>2012-01-31T08:15:58</DateTime> 
    <SessionID>1</SessionID> 
    <Form> 
    <FriendlyName>Chocolade</FriendlyName> 
    </Form> 
    <To> 
    <FriendlyName>[email protected]</FriendlyName> 
    </To> 
</Message> 

这是很相似,你的,但现在,如果你需要得到有关消息,你并不需要的所有信息到PASE XML,你只需要反序列化,并获得自己Message类的正确的实例:

StreamReader reader = new StreamReader(xmlToSerializePath); 
Message deserializedMessage = (Message)serializer.Deserialize(reader); 
reader.Close(); 

当你得到你的消息的情况下,你可以操纵它像你想和填补这个文本框与消息的任何信息:

textBox1.Text = string.Format("{0} {1} {2} {3}", 
      deserializedMessage.DateTime, 
      deserializedMessage.Form.FriendlyName, 
      deserializedMessage.To.FriendlyName, 
      deserializedMessage.SessionID); 

文本框的文本将是以下几点:

31.01.2012 8:15:58 Chocolade [email protected] 1 

/================= ================================================== ===============/

如果你不喜欢或不想使用这样的方法,或者你只需​​要解析已经由某些第三人称xml创建,则可以使用LINQ to XML语法。例如:

创建的XDocument实例:

string xmlStringPath = @"d:/adilipman1937067724.xml"; 
XDocument document = new XDocument(xmlStringPath); 

,但有时也可以抛出异常,所以你需要创建的XmlDocument,加载XML字符串,并使用静态的XDocument方法来解析该字符串:

XmlDocument doc = new XmlDocument(); 
doc.Load(xmlString); 
XDocument document = XDocument.Parse(doc.OuterXml); 

关注XDocument和XmlDocument。这是两种不同的类型。然后你可以使用linq语法解析你的文档:

// Get root message element 
var messageElement = (from element in document.Elements() 
            where element.Name == "Message" 
            select element).FirstOrDefault(); 

// Get date attribute of message element 
string date = messageElement.Attribute("Date").Value; 

// Get To element 
// Notice that we make select from elements of message element messageElement.Elements() 
// You should closely follow about what attribute are you making select from, 
// because your selection will return null, and you will get errors. 
var toElement = (from element in messageElement.Elements() 
          where element.Name == "To" 
           select element).FirstOrDefault(); 

// Then we take value of user element friendly name attribute 
// We get element (tag) User of all possible existing sub tags of tag To 
string toFriendlyName = 
       (from element in toElement.Elements() 
       where element.Name == "User" 
       select element.Attribute("FriendlyName").Value).FirstOrDefault(); 

等等每个属性或元素。正如你所看到的,用手“解析xml”是非常困难和笨重的工作。所以我会建议你使用序列化。希望我的回答对你有帮助。