C#LINQ使用带有不区分大小写查询的xml

时间:2016-12-06 15:11:44

标签: c# xml linq

我试图使用将遍历xml文档的LINQ查询。但是,我想要使用OR语句或string.toLower()来确保它始终获得所需的数据

我目前有:

// read all <item> tags and put the in an array.
XDocument xml = XDocument.Parse(xmlData);
var newItems = (from story in xml.Descendants("item")
    select new Feed
    {
        Title = ((string) story.Element("title")),
            Link = ((string) story.Element("link")),
            Description = ((string) story.Element("description")),
            PublishDate = ((string) story.Element("pubDate")),
    }
).Take(20).ToList();

我还想改变什么:

  1. (E.G。)Title = ((string)story.Element("title"))需要搜索不区分大小写的内容。
  2. from story in xml.Descendants("item") select new Feed需要在项目和条目中搜索(两者都不区分大小写)。
  3. PS:当我在浏览RSS文档时,我无法直接访问XML文档。

    感谢您的投入。

2 个答案:

答案 0 :(得分:2)

你可以为此创建扩展方法。这是我通常使用的课程:

public static class XElementExtensions {
    public static bool EqualsIgnoreCase(this XName name1, XName name2) {
        return name1.Namespace == name2.Namespace &&
            name1.LocalName.Equals(name2.LocalName, StringComparison.OrdinalIgnoreCase);
    }

    public static XElement GetChild(this XElement e, XName name) {
        return e.EnumerateChildren(name).FirstOrDefault();
    }

    public static IEnumerable<XElement> EnumerateChildren(this XElement e, XName name) {
        return e.Elements().Where(i = > i.Name.EqualsIgnoreCase(name));
    }
}

然后,您可以将代码更改为以下内容:

var newItems = (from story in xml.Root.EnumerateChildren("item")
select new Feed
{
    Title = ((string) story.GetChild("title")),
        Link = ((string) story.GetChild("link")),
        Description = ((string) story.GetChild("description")),
        PublishDate = ((string) story.GetChild("pubDate")),
}).Take(20).ToList();

答案 1 :(得分:0)

XML通常由模式定义 - 它应该具有元素名称的固定格式 - 因此import time import serial class WavePlate(serial.Serial): """ This class returns an instance that contains the attributes and methods of a ``serial.Serial`` object. """ def __init__(self, p, brate): """Here's the constructor. """ self.p = p self.brate = brate serial.Serial.__init__(self, port=self.p, baudrate=self.brate, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE) 与XML中的title不一样。我不认为使用TiTlE

可以做你想做的事