使xml文件根据属性排序,如何做?

xiaohanghong 2008-06-04 01:31:24
<Dictrionary>
<A>
<Dic name="Awa" />
<Dic name="Ac" />
<Dic name="Aa" />
</A>
<B>
<Dic name="Bz" />
<Dic name="Bc" />
<Dic name="Ba" />
</B>
....
</Dictrionary>

使它们按照,name属性按字母排序。



我的代码是参照网上的,不知道对不对!
我的代码是参照网上的,不知道对不对!
我的代码是参照网上的,不知道对不对!
我的代码是参照网上的,不知道对不对!
我的代码是参照网上的,不知道对不对!
XmlDocument doc = new XmlDocument();
doc.Load(@"customers.xml");
//创建导航器
XPathNavigator nav = doc.CreateNavigator();

XPathExpression exp = nav.Compile("/Dictrionary/A");

exp.AddSort("Dic", XmlSortOrder.Descending, XmlCaseOrder.None, "", XmlDataType.Text);

XPathNodeIterator iter = nav.Select(exp);
//循环迭代对象
while (iter.MoveNext())
{
XPathNavigator copy = iter.Current.Clone();
copy.MoveToFirstChild();
copy.MoveToNext();
copy.MoveToNext(); }
...全文
448 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaohanghong 2008-06-04
  • 打赏
  • 举报
回复
学习,学习。
ericzhangbo1982111 2008-06-04
  • 打赏
  • 举报
回复
哈哈,我不知道这样能不能排序....
大概意思就是
取得
<Dic name="Aa" />
<Dic name="Ac" />
<Dic name="Awa" />
<Dic name="Ba" />
<Dic name="Bc" />
<Dic name="Bz" />
这些数据
然后排序以下

然后再找到
<Dictrionary>
<A>
<Dic name="Awa" />
<Dic name="Ac" />
<Dic name="Aa" />
</A>
<B>
<Dic name="Bz" />
<Dic name="Bc" />
<Dic name="Ba" />
</B>
</Dictrionary>
下面的a 和b 节点
按照它们的count 添加排序好的节点

其实14楼的方法很好
xiaohanghong 2008-06-04
  • 打赏
  • 举报
回复
谢谢。
xiaohanghong 2008-06-04
  • 打赏
  • 举报
回复
ericzhangbo1982111

能给讲解一下吗?
lovefootball 2008-06-04
  • 打赏
  • 举报
回复
给你个完整的


string xmlPath = "e:\\2.xml";
XmlDocument xmldoc = new XmlDocument();
xmldoc.Load(xmlPath);
XPathDocument pathdoc = new XPathDocument(xmlPath);
XmlNodeList ndoes = xmldoc.DocumentElement.ChildNodes;
foreach (XmlNode node in ndoes)
{
XPathNavigator nav = pathdoc.CreateNavigator();
string xpath = String.Format("/Dictrionary/{0}/Dic", node.Name);
XPathExpression exp = nav.Compile(xpath);
exp.AddSort("@name", XmlSortOrder.Ascending, XmlCaseOrder.None, "", XmlDataType.Text);
XPathNodeIterator nodeIter = nav.Select(exp);
node.RemoveAll();
while (nodeIter.MoveNext())
{
XmlElement xe = xmldoc.CreateElement("Dic");
xe.SetAttribute("name", nodeIter.Current.GetAttribute("name", ""));
node.AppendChild(xe);
}
}
xmldoc.Save(xmlPath);
ericzhangbo1982111 2008-06-04
  • 打赏
  • 举报
回复
XmlDocument doc = new XmlDocument();
doc.Load(@"D:\Project\C#Test\WindowsApplication1\WindowsApplication3\Config.xml");
XmlNodeList nodeList = doc.SelectNodes("/Dictrionary/*/*");

List <XmlElement> list = new List <XmlElement>();
foreach (XmlElement el in nodeList)
{
list.Add(el);
}

list.Sort(new sort());

XmlNode node = doc.SelectSingleNode("/Dictrionary");
int index = 0;
foreach (XmlNode n in node.ChildNodes)
{

int count = n.ChildNodes.Count;
n.RemoveAll();

for (int j = index; j < list.Count; j++)
{
n.AppendChild(list[j]);
index++;
if (index == count)
break;
}


}
doc.Save(@"D:\Project\C#Test\WindowsApplication1\WindowsApplication3\Config.xml");


public class sort : IComparer <XmlElement>
{
#region IComparer <XmlNode> Members

public int Compare(XmlElement x, XmlElement y)
{
return string.Compare(x.Attributes[0].Value, y.Attributes[0].Value);
}

#endregion
}


帮你顶下。
xiaohanghong 2008-06-04
  • 打赏
  • 举报
回复
我最后的结果,是想把那个xml文件。排序!
我最后的结果,是想把那个xml文件。排序!
我最后的结果,是想把那个xml文件。排序!
我最后的结果,是想把那个xml文件。排序!
shinaterry 2008-06-04
  • 打赏
  • 举报
回复
接分接分..
lovefootball 2008-06-04
  • 打赏
  • 举报
回复
已经给了你代码了
自己调试下就可以了啊

你最后想要什么结果??
A和B是否需要排序???

看一下如下代码如果不符合你的要求
把你的要求说的详细些
贴出来你排序后想要的结果

StringBuilder unsorted = new StringBuilder();
StringBuilder sorted = new StringBuilder();

XPathDocument doc = new XPathDocument("e:\\2.xml"); //这里改成你自己的文件
XPathNavigator nav = doc.CreateNavigator();
string xpath = "/Dictrionary/A/Dic";
XPathNodeIterator nodeIter1 = nav.Select(xpath);
while (nodeIter1.MoveNext())
{
unsorted.Append(nodeIter1.Current.GetAttribute("name", "") + "\n");
}
Console.WriteLine(unsorted.ToString());//排序之前的状态

XPathExpression exp = nav.Compile(xpath);
exp.AddSort("@name", XmlSortOrder.Ascending, XmlCaseOrder.None, "", XmlDataType.Text);
XPathNodeIterator nodeIter2 = nav.Select(exp);
while (nodeIter2.MoveNext())
{
sorted.Append(nodeIter2.Current.GetAttribute("name", "") + "\n");
}
Console.WriteLine(sorted.ToString());//排序后的状态

上面的例子只是对A下面的Dic节点的Name属性排序!!!
yilanwuyu123 2008-06-04
  • 打赏
  • 举报
回复
UP 楼主太不容易了.
xiaohanghong 2008-06-04
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20080603/10/619cc1d0-5f45-4f5f-93f8-2d6c5d4d717b.html
这还有分。解决后一并送上。
sxmonsy 2008-06-04
  • 打赏
  • 举报
回复
楼上的可行.
xiaohanghong 2008-06-04
  • 打赏
  • 举报
回复
<?xml version="1.0" standalone="yes"?>
<DocumentElement>
<Dic name="Aa" />
<Dic name="Ac" />
<Dic name="Awa" />
<Dic name="Ba" />
<Dic name="Bc" />
<Dic name="Bz" />
</DocumentElement>

按dataSet后,字母没了!!!!!!
懒牛科技 2008-06-04
  • 打赏
  • 举报
回复
呵呵.
提供个方法,不过好像很烦
1:把xml读成dataset,用dataview就行排序,
2:把排序的dataset WriteXMl()
就可以了!
xiaohanghong 2008-06-04
  • 打赏
  • 举报
回复
是的!是昨天问的。问题没解决。分不够了。又注册了一个号。真烦。
xiaohanghong 2008-06-04
  • 打赏
  • 举报
回复
排序完,保存xml文件。
排序完,保存xml文件。
排序完,保存xml文件。
排序完,保存xml文件。
排序完,保存xml文件。
排序完,保存xml文件。
排序完,保存xml文件。
排序完,保存xml文件。
排序完,保存xml文件。
排序完,保存xml文件。
排序完,保存xml文件。
ericzhangbo1982111 2008-06-04
  • 打赏
  • 举报
回复
好像有人问过这样的问题。。
就在昨天
难道是一个人吗?

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧