需要帮助阅读使用LINQ to XML读取XML文件

时间:2015-02-03 17:41:50

标签: c# xml linq linq-to-xml

我有以下XML文件:

<DATASET>
<MESSAGE TYPE="TYPE1 ">
<FROM>
</FROM>
<EMAILRECIPIENTS>
<TO>
email@email.com
</TO>
</EMAILRECIPIENTS>
<SUBJECT>
tHIS IS A SUBJECT
</SUBJECT>
<BODY>
THIS is the bidoy
</BODY>
<ATTACHED>
<CONTENT>                this is some content                </CONTENT>
<CONTENT>                this is some content                </CONTENT>
<CONTENT>                this is some content                </CONTENT>
<CONTENT>                this is some content                </CONTENT>
<CONTENT>                this is some content                </CONTENT>
</ATTACHED>
</MESSAGE>
<MESSAGE TYPE="TYPE1 ">
<FROM>
</FROM>
<EMAILRECIPIENTS>
<TO>
email2@email.com
</TO>
</EMAILRECIPIENTS>
<SUBJECT>
this IS A SUBJECT
</SUBJECT>
<BODY>
THIS is the body
</BODY>
<ATTACHED>
<CONTENT>                this is some content2                </CONTENT>
<CONTENT>                this is some content2                </CONTENT>
<CONTENT>                this is some content2                </CONTENT>
<CONTENT>                this is some content2                </CONTENT>
<CONTENT>                this is some content2               </CONTENT>
</ATTACHED>
</MESSAGE>
<MESSAGE TYPE="TYPE1 ">
<FROM>
</FROM>
<EMAILRECIPIENTS>
<TO>
email3@email.com
</TO>
</EMAILRECIPIENTS>
<SUBJECT>
tHIS IS A SUBJECT
</SUBJECT>
<BODY>
THIS is the body3
</BODY>
<ATTACHED>
<CONTENT>                this is some content3                </CONTENT>
<CONTENT>                this is some content3                </CONTENT>
<CONTENT>                this is some content3                </CONTENT>
<CONTENT>                this is some content3                </CONTENT>
<CONTENT>                this is some content3                </CONTENT>
</ATTACHED>
</MESSAGE>
</DATASET>

现在我尝试编写一个类来存储这些信息:

public class Dataset
{
public List<Message> Messages = new List<Message>();
}

public class Message
{
public string MessageType { get; set;}
public string From { get; set; }
public string Recipients { get; set; }
public string Subject { get; set; }
public string Body { get; set; }
public string Attachmentfilename { get; set; }
public string Record { get; set; }
}

现在在我的主要部分我尝试了这个:

 List<Message> messagelist = new List<Message(
 (
 from e in XDocument.Load(@"c:\XML\1.XML").Descendants("DATASET")
 select new Message
 {
   MessageType = e.Element("MESSAGE").Attribute("TYPE").Value,
   From = e.Element("MESSAGE").Element("FROM").Value,
   Subject = e.Element("MESSAGE").Element("SUBJECT").Value,
   Body = e.Element("MESSAGE").Element("BODY").Value,
   AttachmentFileName = e.Element("MESSAGE").Element("ATTACHEMENT").Attribute("FILENAME").Value,
   Record = e.Element("MESSAGE").Element("ATTACHEMENT").ELement("CONTENT").Value
 }).ToList());

现在,我对自己的价值观念进行了尝试。我是不是真的这么做错了。我只是想将XML文件解析为列表或者我可以经历的事情,并根据值发送电子邮件。

我的想法是获取可能包含一条记录或多条记录的XML文件。我的代码不起作用,主要是因为我不知道自己在做什么,有关处理这个问题的方法的任何建议,或者使用LINQ to XML来解析上面提到的这个文件会很棒。

我已经开始运行了,但它似乎只是将第一条消息拉入列表而只是第一行的内容。

我正在将整个XML文件拉到列表中,XML文件可以有多个消息。可能是一个,可能有20个。

我希望列表接受多条消息,这段代码似乎只能拉出第一条消息。

我想将CONTENT输出到一个文档,其中每个文档都是一个保留空格和每行的行项目。

我可以更改哪些内容使其接受多行内容和多条消息?

4 个答案:

答案 0 :(得分:1)

正如我在评论中所建议的那样,我宁愿让XmlSerializer完成工作:

您的留言类

[XmlType("MESSAGE")]
public class Message
{
    [XmlElement("FROM")]
    public string From { get; set; }

    [XmlArray("EMAILRECIPIENTS")]
    [XmlArrayItem("TO")]
    public List<string> Recipients { get; set; }

    [XmlElement("SUBJECT")]
    public string Subject { get; set; }

    [XmlElement("BODY")]
    public string Body { get; set; }

    [XmlArray("ATTACHED")]
    [XmlArrayItem("CONTENT")]
    public List<string> Attachments { get; set; }
}

...使用XmlSerializer就像

一样简单
var msgs = new XmlSerializer(typeof(List<Message>), new XmlRootAttribute("DATASET"));

using (var sr = new StreamReader(@"c:\XML\1.XML"))
{
    var messages = msgs.Deserialize(sr);
}

答案 1 :(得分:0)

首先,没有结束</MESSAGE>。 其次,您的<MESSAGE>没有<RECORD>。 再次检查您的XML。您的代码中没有明显的问题。

答案 2 :(得分:0)

xml文档有一个名为EMAILRECIPIENTS的标记但数据集类没有匹配的属性 - 它只有Recipients

同样在您的代码中,您有以下行

Record = e.ELement("CONTENT").Value

但在XML文件中,所有Content代码都是Attached代码的子代

答案 3 :(得分:0)

首先,让我们清理您的代码。你有太多不必要的东西,并且引用了错误的值。元素DATASET中没有FROM,SUBJECT,CONTENT。其中一些是MESSAGE的孩子,而CONTENT是ATTACHED的孩子,

List<Message> messagelist = XElement.Load(file)
    .Descendants("MESSAGE")
    .Select(e => new Message
    {
       From = e.Element("FROM").Value,
       Subject = e.Element("SUBJECT").Value,
       Record = string.Join("\n", e.Descendants("CONTENT")
                                   .Select(c => c.Value)
                                   .ToArray())
    }).ToList();