微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

CodeGo.net>如何使用LINQ解析XML与XDocument对象

我有一个xml文件,如下所示:

<Message xsi:schemaLocation ="..">
    <Header>..</Header>
    <Body>
        <History 
            xmlns="..">
            <Number></Number>
            <Name></Name>
            <Item>
                <CreateDate>..</CreateDate>
                <Type>..</Type>
                <Description></Description>
            </Item>
            <Item>
                <CreateDate>..</CreateDate>
                <Type>..</Type>
                <Description>1..</Description>
                <Description>2..</Description>
            </Item>
        </History>
    </Body>
</Message>

我想以此作为历史对象来创建和反对.

public class History
{
    public string Name { get; set; }
    public string Number { get; set; }
    public List<Item> Items { get; set; }

}



    var xElement = XDocument.Parse(xmlString);

    XElement body = (XElement)xElement.Root.LastNode;
    XElement historyElement = (XElement)body.LastNode;

    var history = new History
    {
        Name = (string)historyElement.Element("Name"),
        Number = (string)historyElement.Element("Number"),
        Items = (
               from e in historyElement.Elements("Item")
               select new Item
               {
                   CraeteDate = DateTime.Parse(e.Element("CreateDate").Value),
                   Type = (string)e.Element("Type").Value,
                   Description = string.Join(",",
                       from p in e.Elements("Description") select (string)p.Element("Description"))
               }).ToList()

    };

为什么这不起作用?

该值始终为空.

似乎“ historyElement.Element(“ Name”)“始终为空,即使有一个元素和该元素的值.

知道我想念什么吗?

谢谢

解决方法:

这是由于名称空间所致,请尝试执行以下操作:

XNamespace ns =  "http://schemas.microsoft.com/search/local/ws/rest/v1";// the namespace you have in the history element
var xElement = XDocument.Parse(xmlString);

var history= xElement.Descendants(ns+"History")
                     .Select(historyElement=>new History{ Name = (string)historyElement.Element(ns+"Name"),
                                                          Number = (string)historyElement.Element(ns+"Number"),
                                                          Items = (from e in historyElement.Elements(ns+"Item")
                                                                   select new Item
                                                                          {
                                                                            CraeteDate= DateTime.Parse(e.Element(ns+"CreateDate").Value),
                                                                            Type = (string) e.Element(ns+"Type").Value,
                                                                            Description= string.Join(",",
                                                                             from p in e.Elements(ns+"Description") select (string)p)
                                                                           }).ToList()
                                                          }).FirstOrDefault();

如果您想了解更多有关此主题内容,请查看此link

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。