首页 > 解决方案 > 使用 C#、LINQ 对 XML 中的对象进行排序并写回新的 XML 文件

问题描述

我有以下 XML 文件,并且想根据修订节点对对象进行排序,然后将排序的对象写回 XML 文件。我试过 LINQ 但没有运气

 <?xml version="1.0" encoding="utf-8"?>
<v1:VNETList xmlns="http://www.xxxxxx.com/NET/eeim" xmlns:v1="http://www.xxxxxx.com/NET/List">
    <Objects> 
         <ID>00-0000-PPP-0001 Template</ID>
        <Object>
          <ID>00-0000-PPP-0001</ID>
           <Revision>2.0</Revision>
          <Name>600-0000-PPP-0001</Name>
          <ClassID>CL_Diagram</ClassID>
          <Association type="is fulfilled by">
            <Object>
              <ID>aae9d_application/pdf</ID>
              <Revision>2.0</Revision>
              <ClassID>FILE</ClassID>
              <Characteristic>
                <Name>InfoType</Name>
                <Value>pdf</Value>
              </Characteristic>                   
            </Object>
          </Association>
          <Characteristic>
            <Name>Status</Name>
            <Value>Historic</Value>
          </Characteristic>
        </Object>
        <Object>
          <ID>00-0000-PPP-0001</ID>
           <Revision>3.0</Revision>
          <Name>00-0000-PPP-0001</Name>
          <ClassID>CL_Diagram</ClassID>
          <Association type="is fulfilled by">
            <Object>
              <ID>090aaead_application/pdf</ID>
              <Revision>3.0</Revision>
              <ClassID>FILE</ClassID>                 
            </Object>
          </Association>
          <Characteristic>
            <Name>Transmittal Number</Name>
            <Value>111111</Value>
          </Characteristic>
          <Characteristic>
            <Name>Is PSI</Name>
            <Value>yes</Value>
          </Characteristic>         
        </Object>
        <Object>
          <ID>00-0000-PPP-0001</ID>          
          <Revision>1.0</Revision>
          <Name>00-0000-PPP-0001</Name>
          <ClassID>CL_Diagram</ClassID>
          <Characteristic>
            <Name>Is Confidential?</Name>
            <Value>False</Value>
          </Characteristic>
          <Characteristic>
            <Name>Is PSI</Name>
            <Value>yes</Value>
          </Characteristic>
        </Object>
    </Objects>

我想订购,所以修订版 1 将首先出现,然后是 2,最后是三个。任何帮助将不胜感激。

标签: c#xmllinqsorting

解决方案


尝试 xml linq :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);

            XElement objects = doc.Descendants().Where(x => x.Name.LocalName == "Objects").FirstOrDefault();

            XElement firstObject = objects.Elements().Where(x => x.Name.LocalName == "Object").FirstOrDefault();
            XNamespace ns = firstObject.GetDefaultNamespace();

            List<XElement> sortedObjects = objects.Elements(ns + "Object")
                .OrderBy(x => (string)x.Descendants(ns + "Revision").FirstOrDefault())
                .ToList();

            objects.Elements(ns + "Object").Remove();

            objects.Add(sortedObjects);

            doc.Save(FILENAME);

        }
    }

}

推荐阅读