C#linq xml节点排序,移动问题!

一笑拔剑 2016-03-16 11:06:25
一个xml文件如下
<?xml version="1.0" encoding="utf-8"?>
<root>
<item1>
<timer start="01:00" end="00:00">
<id >1</id>
<id >2</id>
<id>3</id>
<id>4</id>
<id >5</id>
<id>6</id>
</timer>
<timer start="03:00" end="00:00" />
..................................................................
<timer start="04:00" end="00:00" />
</item1>
</root>
这里id的要求是按顺序排序主要是删除Id的节点
添加和删除最后的节点还是比较好写的
现在的问题是
比如删除中间的节点,比如删除4,
怎么吧下面的节点5改成4,6改成5
id节点中是有其他属性和数据的.只改变他的值.
另外除了删除还有一个情况就是如果把最后的节点,移至最前,
然后也是按照顺序排下来,请问代码怎么写?
...全文
383 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
一笑拔剑 2016-03-18
  • 打赏
  • 举报
回复
引用 6 楼 fei2yun 的回复:
最直接简单的方法,就是将XML和实体类对应,序列化与反序列化。 XML To Entity(Model)

        public static T Load(string EntityPath)
        {
            try
            {
                T s;
                using (FileStream fs = new FileStream(EntityPath, FileMode.Open))
                {
                    XmlSerializer formatter = new XmlSerializer(typeof(T));
                    s = (T)formatter.Deserialize(fs);
                }

                if (s != null)
                    return s;
                else
                    return default(T);
            }
            catch
            {
                return default(T);
            }
        }
当转换成一个实体类之后,你爱怎么排序就怎么排序.Linq
谢谢回复 对这一块了解不多,代码能稍微具体一点么?
一笑拔剑 2016-03-18
  • 打赏
  • 举报
回复
引用 2 楼 starfd 的回复:
string xml = @"<?xml version=""1.0"" encoding=""utf-8""?>
<root>
<item1>
<timer start=""01:00"" end=""00:00"">
<id value=""1"">1</id>
<id value=""2"">2</id>
<id value=""3"">3</id>
<id value=""4"">4</id>
<id value=""5"">5</id>
<id value=""6"">6</id>
</timer>
</item1>
</root>";
XElement root = XElement.Parse(xml);
var timer = root.Element("item1").Element("timer");
int id = 4;
timer.Elements("id").Where(e => e.Value == id.ToString()).Remove();
foreach (var e in timer.Elements("id").Where(e=>int.Parse( e.Value) > id))
{
    e.Value = id.ToString();
    id++;
}
Console.WriteLine(root);
谢谢回复 代码修改后可用, 我c#用的不多,xml这一块也不怎么使用,具体的代码还是不太熟悉 能不能麻烦您解答下我后面的疑惑 就是如何移动某节点(我的Id节点有其他的属性,需要整个带属性进行移动) 就是比如把最后的节点,移动到最前, 然后也是按照顺序排下来,请问代码怎么写? 因为我百度看了好像没有指定位置插入的这种代码,望能解答疑惑,谢谢
一笑拔剑 2016-03-18
  • 打赏
  • 举报
回复
引用 9 楼 starfd 的回复:
Linq是没有直接插入,但Node自身支持AddAfterSelf和AddBeforeSelf方法 以你的例子为例,你可以先找到你要的node,然后从父节点移除,再对第一个节点进行AddBeforeSelf方法
谢谢,了解了,结贴
一笑拔剑 2016-03-18
  • 打赏
  • 举报
回复
引用 10 楼 fei2yun 的回复:
[quote=引用 8 楼 aspower_ 的回复:] [quote=引用 6 楼 fei2yun 的回复:] 最直接简单的方法,就是将XML和实体类对应,序列化与反序列化。 XML To Entity(Model)

        public static T Load(string EntityPath)
        {
            try
            {
                T s;
                using (FileStream fs = new FileStream(EntityPath, FileMode.Open))
                {
                    XmlSerializer formatter = new XmlSerializer(typeof(T));
                    s = (T)formatter.Deserialize(fs);
                }

                if (s != null)
                    return s;
                else
                    return default(T);
            }
            catch
            {
                return default(T);
            }
        }
当转换成一个实体类之后,你爱怎么排序就怎么排序.Linq
谢谢回复 对这一块了解不多,代码能稍微具体一点么?[/quote] http://www.cnblogs.com/yukaizhao/archive/2011/07/22/xml-serialization.html[/quote] 看了下代码,不是很适合使用,多谢回复
  • 打赏
  • 举报
回复
Linq是没有直接插入,但Node自身支持AddAfterSelf和AddBeforeSelf方法 以你的例子为例,你可以先找到你要的node,然后从父节点移除,再对第一个节点进行AddBeforeSelf方法
正怒月神 2016-03-17
  • 打赏
  • 举报
回复
逻辑上来说, 先删除对应的节点。然后整个全部重新赋值比较简单。
q107770540 2016-03-17
  • 打赏
  • 举报
回复
先删除节点 然后遍历改值嘛
  • 打赏
  • 举报
回复
linq to xml 读取节点集合,删除后 更改XElement的Value值,也就是5改成4,最后重新Save。 思路都有,代码是可以写出来的。。
  • 打赏
  • 举报
回复
string xml = @"<?xml version=""1.0"" encoding=""utf-8""?>
<root>
<item1>
<timer start=""01:00"" end=""00:00"">
<id value=""1"">1</id>
<id value=""2"">2</id>
<id value=""3"">3</id>
<id value=""4"">4</id>
<id value=""5"">5</id>
<id value=""6"">6</id>
</timer>
</item1>
</root>";
XElement root = XElement.Parse(xml);
var timer = root.Element("item1").Element("timer");
int id = 4;
timer.Elements("id").Where(e => e.Value == id.ToString()).Remove();
foreach (var e in timer.Elements("id").Where(e=>int.Parse( e.Value) > id))
{
    e.Value = id.ToString();
    id++;
}
Console.WriteLine(root);
Justin-Liu 2016-03-17
  • 打赏
  • 举报
回复
XmlDocument相关对象,再加上自己的处理逻辑

111,092

社区成员

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

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

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