LINQ to Xml 帮助

发布于 2024-11-03 22:40:10 字数 1943 浏览 0 评论 0原文

我之前发布了另一篇关于如何使用 XSLT 转换 XmlDocument 的文章,但也许​​可以使用 LINQ 来代替。

我有一个类似于以下内容的 XmlDocument:

<DocumentElement>
  <Customer>
    <CustomerId>2315</CustomerId>
    <VersionNumber>1</VersionNumber>
    <GUID>2E05DE20-02A0-425D-944D-65E5E744FF8A</GUID>
  </Customer>
  <Customer>
    <CustomerId>2316</CustomerId>
    <VersionNumber>2</VersionNumber>
    <GUID>2E05DE20-02A0-425D-944D-65E5E744FF8A</GUID>
  </Customer>
  <Customer>
    <CustomerId>2317</CustomerId>
    <VersionNumber>1</VersionNumber>
    <GUID>9995DE20-02A0-425D-944D-65E5E744FF8A</GUID>
  </Customer>
</DocumentElement>

我可以使用 LINQ 为每个唯一的 GUID 提取一个客户元素并获取具有最高版本号的客户吗?

即新的/转换后的文档将如下所示:

<DocumentElement>
  <Customer>
    <CustomerId>2316</CustomerId>
    <VersionNumber>2</VersionNumber>
    <GUID>2E05DE20-02A0-425D-944D-65E5E744FF8A</GUID>
  </Customer>
  <Customer>
    <CustomerId>2317</CustomerId>
    <VersionNumber>1</VersionNumber>
    <GUID>9995DE20-02A0-425D-944D-65E5E744FF8A</GUID>
  </Customer>
</DocumentElement>

提前致谢。

更新:

所以我应该这样做(如果我理解正确的话?):

    XDocument xdoc = new XDocument();
    using (StringWriter sw = new StringWriter())
    {
        // Converts the datatable to XML                             
        dt.WriteXml(sw);
        xdoc = XDocument.Parse(sw.ToString());
    }

        var query = xdoc.Root
            .Elements("Customer")
            .GroupBy(x => x.Element("GUID").Value)
            .Select(g => g.OrderByNumberDescending(x =>(int)x.Element("VersionNumber"))
                          .First());

我仍然在 GroupBy 上收到错误,或者我在这里做错了什么?

I posted another post earlier on on how to transform an XmlDocument with XSLT but maybe it is possible to do with LINQ instead.

I have an XmlDocument that looks something like:

<DocumentElement>
  <Customer>
    <CustomerId>2315</CustomerId>
    <VersionNumber>1</VersionNumber>
    <GUID>2E05DE20-02A0-425D-944D-65E5E744FF8A</GUID>
  </Customer>
  <Customer>
    <CustomerId>2316</CustomerId>
    <VersionNumber>2</VersionNumber>
    <GUID>2E05DE20-02A0-425D-944D-65E5E744FF8A</GUID>
  </Customer>
  <Customer>
    <CustomerId>2317</CustomerId>
    <VersionNumber>1</VersionNumber>
    <GUID>9995DE20-02A0-425D-944D-65E5E744FF8A</GUID>
  </Customer>
</DocumentElement>

Can I, with LINQ, extract one customer element for each unique GUID and get the customer with the highest version number?

I.e. the new/transformed document will look like:

<DocumentElement>
  <Customer>
    <CustomerId>2316</CustomerId>
    <VersionNumber>2</VersionNumber>
    <GUID>2E05DE20-02A0-425D-944D-65E5E744FF8A</GUID>
  </Customer>
  <Customer>
    <CustomerId>2317</CustomerId>
    <VersionNumber>1</VersionNumber>
    <GUID>9995DE20-02A0-425D-944D-65E5E744FF8A</GUID>
  </Customer>
</DocumentElement>

Thanks in advance.

Update:

So I should do (if I understand you correctly?):

    XDocument xdoc = new XDocument();
    using (StringWriter sw = new StringWriter())
    {
        // Converts the datatable to XML                             
        dt.WriteXml(sw);
        xdoc = XDocument.Parse(sw.ToString());
    }

        var query = xdoc.Root
            .Elements("Customer")
            .GroupBy(x => x.Element("GUID").Value)
            .Select(g => g.OrderByNumberDescending(x =>(int)x.Element("VersionNumber"))
                          .First());

I still get the error on GroupBy though, or am I doing something else wrong here?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

掀纱窥君容 2024-11-10 22:40:10

绝对可以:

var query = parent
    .Elements("Customer")
    .GroupBy(x => x.Element("GUID").Value)
    .Select(g => g.OrderByNumberDescending(x => (int) x.Element("VersionNumber"))
                  .First());

或者使用 MoreLINQ

var query = parent
     .Elements("Customer")
     .GroupBy(x => x.Element("GUID").Value)
     .Select(g => g.MaxBy(x => (int) x.Element("VersionNumber")));

Absolutely:

var query = parent
    .Elements("Customer")
    .GroupBy(x => x.Element("GUID").Value)
    .Select(g => g.OrderByNumberDescending(x => (int) x.Element("VersionNumber"))
                  .First());

Or using MoreLINQ:

var query = parent
     .Elements("Customer")
     .GroupBy(x => x.Element("GUID").Value)
     .Select(g => g.MaxBy(x => (int) x.Element("VersionNumber")));
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文