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"));