C# 我有一个包含XML字符串的列表。如何根据XML属性之一对该列表进行排序?

C# 我有一个包含XML字符串的列表。如何根据XML属性之一对该列表进行排序?,c#,xml,string,C#,Xml,String,例如: 该清单的定义如下: List<string> listOfXML = new List<string>(); List listOfXML=new List(); 如果此列表包含下面给出的3个XML字符串,如何根据“ThirdAttribute”对此列表进行排序 XML字符串1: <Element> <FirstAttribute>A</FirstAttribute>> <SecondAttribu

例如:

该清单的定义如下:

List<string> listOfXML = new List<string>();
List listOfXML=new List();
如果此列表包含下面给出的3个XML字符串,如何根据“ThirdAttribute”对此列表进行排序

XML字符串1:

<Element>  
  <FirstAttribute>A</FirstAttribute>> 
  <SecondAttribute>B</SecondAttribute> 
  <ThirdAttribute>3</ThirdAttribute> 
</Element>

A>
B
3.
XML字符串2:

<Element>  
   <FirstAttribute>C</FirstAttribute>> 
   <SecondAttribute>D</SecondAttribute> 
   <ThirdAttribute>4</ThirdAttribute> 
</Element>

C>
D
4.
XML字符串3:

<Element>  
   <FirstAttribute>A</FirstAttribute>> 
   <SecondAttribute>B</SecondAttribute> 
   <ThirdAttribute>1</ThirdAttribute> 
</Element>

A>
B
1.
排序后的列表中的元素应按以下顺序排列:

<Element>  
   <FirstAttribute>A</FirstAttribute>> 
   <SecondAttribute>B</SecondAttribute> 
   <ThirdAttribute>1</ThirdAttribute> 
</Element>

<Element>  
  <FirstAttribute>A</FirstAttribute>> 
  <SecondAttribute>B</SecondAttribute> 
  <ThirdAttribute>3</ThirdAttribute> 
</Element>

<Element>  
   <FirstAttribute>C</FirstAttribute>> 
   <SecondAttribute>D</SecondAttribute> 
   <ThirdAttribute>4</ThirdAttribute> 
</Element>

A>
B
1.
A>
B
3.
C>
D
4.

使用linq to xml,您可以执行以下操作:

orderedList = listOfXml.OrderBy(x =>(int)XElement.Parse(x).Element("ThirdAttribute"))

丹尼斯有一个更好的答案。

一个非常非常糟糕的解决方案,但是一个解决方案

List<string> listOfXML = new List<string>()
            {
               @"<Element>  
  <FirstAttribute>A</FirstAttribute>> 
  <SecondAttribute>B</SecondAttribute> 
  <ThirdAttribute>3</ThirdAttribute> 
</Element>",
           @"<Element>  
   <FirstAttribute>C</FirstAttribute>> 
   <SecondAttribute>D</SecondAttribute> 
   <ThirdAttribute>4</ThirdAttribute> 
</Element>",
           @"<Element>  
   <FirstAttribute>A</FirstAttribute>> 
   <SecondAttribute>B</SecondAttribute> 
   <ThirdAttribute>1</ThirdAttribute> 
</Element>"
            };

List<string> order = new List<string>();
int[] orders = new int[listOfXML.Count];

int arraylength = orders.Length;

for (int i = 0; i < arraylength; i++)
{
    orders[i] = Convert.ToInt32(XElement.Parse(listOfXML[i]).Element("ThirdAttribute").Value);
}
Array.Sort(orders);

for (int i = 0; i < arraylength; i++)
{
    string orderedXMLString = GetXmlString(orders[i], listOfXML);
    order.Add(orderedXMLString);
}

 private static string GetXmlString(int p, List<string> listOfXML)
{
    string retXML = string.Empty;
    foreach (var item in listOfXML)
    {
        if (p == Convert.ToInt32(XElement.Parse(item).Element("ThirdAttribute").Value))
        {
            retXML = item;
        }
    }
    return retXML;
}
我一开始试过了,但没能超越这个极限!!! 因此,我想出了上面的糟糕解决方案。

公共类XmlAttributesIntComparer:IComparer
public class XmlAttributesIntComparer : IComparer<string>
{
    private readonly string elementName;

    public XmlAttributesIntComparer(string elementName)
    {
        this.elementName = elementName;
    }


    public int Compare(string x, string y)
    {
        XmlDocument doc1 = new XmlDocument();
        doc1.LoadXml(x);

        XmlDocument doc2 = new XmlDocument();
        doc2.LoadXml(y);

        XmlText text1 = (XmlText)doc1.DocumentElement[elementName].FirstChild;
        XmlText text2 = (XmlText)doc2.DocumentElement[elementName].FirstChild;

        int attr1 = Convert.ToInt32(text1.Value);
        int attr2 = Convert.ToInt32(text2.Value);

        return attr1.CompareTo(attr2);
    }
}

// ...
listOfXML.Sort(new XmlAttributesIntComparer("ThirdAttribute"));
{ 私有只读字符串elementName; 公共XmlAttributesIntComparer(字符串元素名称) { this.elementName=elementName; } 公共整数比较(字符串x、字符串y) { XmlDocument doc1=新的XmlDocument(); doc1.LoadXml(x); XmlDocument doc2=新的XmlDocument(); doc2.LoadXml(y); XMLTEXT1=(XmlText)doc1.DocumentElement[elementName].FirstChild; XMLTEXT2=(XmlText)doc2.DocumentElement[elementName].FirstChild; int attr1=Convert.ToInt32(text1.Value); int attr2=Convert.ToInt32(text2.Value); 返回attr1.CompareTo(attr2); } } // ... Sort(新的XmlAttributesIntComparer(“ThirdAttribute”);
@Damith您可以直接施放XElement。值也可以使用,但是您需要额外的解析
int.Parse(XElement.Parse(x).Element(“ThirdAttribute”).Value)
这更短。还有其他方法可以实现吗?我试图通过这个xml字符串列表进行解析,但仍然无法对其进行排序。问题是这3个xml字符串作为单独的元素存储在一个列表中。
public class XmlAttributesIntComparer : IComparer<string>
{
    private readonly string elementName;

    public XmlAttributesIntComparer(string elementName)
    {
        this.elementName = elementName;
    }


    public int Compare(string x, string y)
    {
        XmlDocument doc1 = new XmlDocument();
        doc1.LoadXml(x);

        XmlDocument doc2 = new XmlDocument();
        doc2.LoadXml(y);

        XmlText text1 = (XmlText)doc1.DocumentElement[elementName].FirstChild;
        XmlText text2 = (XmlText)doc2.DocumentElement[elementName].FirstChild;

        int attr1 = Convert.ToInt32(text1.Value);
        int attr2 = Convert.ToInt32(text2.Value);

        return attr1.CompareTo(attr2);
    }
}

// ...
listOfXML.Sort(new XmlAttributesIntComparer("ThirdAttribute"));