您的位置:程序门 -> .net技术 -> c#



xml 操作 的一个问题


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


xml 操作 的一个问题
发表于:2007-09-20 10:57:19 楼主
<?xml   version= "1.0 "   encoding= "gb2312 "?>
<root>
    <item   previd= "97 "   keyid= "96 "   nextid= "95 "   />
    <item   previd= "97 "   keyid= "95 "   nextid= " "   />
</root>

xml   如上

如何   在插入新的   item   之前,
快速的删除xml中   有两项的值与当前要插入item任意两项的值相等的item,
这里的值不包括   空值.

解释:   有两项的值与当前要插入item任意两项的值相等的item
eg   :  
当要插入新的   <item   previd= "97 "   keyid= "95 "   nextid= " "   /> 之前应
删除 <item   previd= "97 "   keyid= "96 "   nextid= "95 "   />
因为     都有   97,   95


   


发表于:2007-09-20 11:16:301楼 得分:0
<item   previd= "97 "   keyid= "95 "   nextid= " "   />
这个节点不是也有97   95么?
为什么不删除?
发表于:2007-09-20 11:21:082楼 得分:0
没听明白
发表于:2007-09-20 11:22:563楼 得分:0
to:     lovefootball(蟑螂(生活就是扯淡--做人要放低姿态))  
          <item   previd= "97 "   keyid= "95 "   nextid= " "   />
            这个节点不是也有97   95么?
          为什么不删除?


  我是说   <item   previd= "97 "   keyid= "95 "   nextid= " "   /> 之前是不存在的
发表于:2007-09-20 11:23:334楼 得分:0
不知道你说的时意思。
发表于:2007-09-20 11:25:355楼 得分:0
任意相等
为什么会有这样的逻辑??

给你个xpath的语法
自己慢慢研究吧
我觉得没什么好办法
只能3个属性按照排列组合分别的写xpath
之间用or的关系连起来查询

http://www.cnblogs.com/wubiyu/archive/2007/07/06/807933.html
发表于:2007-09-20 11:37:566楼 得分:0
xmldocument   xmldoc   =   new   xmldocument();
                xmldoc.load(server.mappath( "aa.xml "));
                xmlnodelist   elist   =   xmldoc.documentelement.childnodes;
                xmlelement   newelt   =   xmldoc.createelement( "item ");
                newelt.setattribute( "previd ",   "97 ");
                newelt.setattribute( "keyid ",   "96 ");
                newelt.setattribute( "nextid ",   "95 ");
                for   (int   i   =   0;   i   <   elist.count;   i++)
                {
                        //比较第1,2个属性是否相等,相等则删除
                        if   (elist[i].attributes[0].value   ==   newelt.attributes[0].value   ¦ ¦   elist[i].attributes[1].value   ==   newelt.attributes[1].value)
                                xmldoc.documentelement.removechild(elist[i]);
                          //比较第1,3个属性是否相等,相等则删除
                          //lz自己写代码了
                          //比较第2,3个属性是否相等,相等则删除
                          //lz自己写代码了

                }
                xmldoc.documentelement.appendchild(newelt);
                xmldoc.save(server.mappath( "aa.xml "));
发表于:2007-09-20 11:49:357楼 得分:0
不知道
发表于:2007-09-20 12:00:328楼 得分:0
来听课了。楼上
发表于:2007-09-20 12:03:089楼 得分:0
重新整理我的问题:
<?xml   version= "1.0 "   encoding= "gb2312 "?>
<root>
    <item   previd= "97 "   keyid= "96 "   nextid= "95 "   />
</root>

xml   如上

如何   在插入新的   item   之前,
快速的删除xml中   有两项的值与当前要插入item任意两项的值相等的item,
这里的值不包括   空值.

解释:   有两项的值与当前要插入item任意两项的值相等的item
eg   :  
当要插入新的   <item   previd= "97 "   keyid= "95 "   nextid= " "   /> 之前应
删除 <item   previd= "97 "   keyid= "96 "   nextid= "95 "   />
因为     都有   97,   95
发表于:2007-09-20 12:05:5810楼 得分:0
哦,纠正一下.
在每个xmldoc.documentelement.removechild(elist[i]);后面,加上continue;


    xmldocument   xmldoc   =   new   xmldocument();
                xmldoc.load(server.mappath( "aa.xml "));
                xmlnodelist   elist   =   xmldoc.documentelement.childnodes;
                xmlelement   newelt   =   xmldoc.createelement( "item ");
                newelt.setattribute( "previd ",   "97 ");
                newelt.setattribute( "keyid ",   "96 ");
                newelt.setattribute( "nextid ",   "95 ");
                for   (int   i   =   0;   i   <   elist.count;   i++)
                {
                        //比较第1,2个属性是否相等,相等则删除
                        if   (elist[i].attributes[0].value   ==   newelt.attributes[0].value   ¦ ¦   elist[i].attributes[1].value   ==   newelt.attributes[1].value)
                        {
                                xmldoc.documentelement.removechild(elist[i]);
                                continue;
                        }
                        //比较第1,3个属性是否相等,相等则删除
                        //自己写代码了
                        //比较第2,3个属性是否相等,相等则删除
                        //自己写代码了

                }
                xmldoc.documentelement.appendchild(newelt);
                xmldoc.save(server.mappath( "aa.xml "));
发表于:2007-09-20 13:00:3611楼 得分:0
不是吧,我接分
发表于:2007-09-20 13:32:0012楼 得分:0
学习中
发表于:2007-09-20 13:40:5013楼 得分:0
xray2005       的方法可行,尽管有点苯但已经理解我的意思

有没有谁能改进一下   使查找过程的时间缩短
发表于:2007-09-20 14:19:4214楼 得分:0
能说清楚点么???
发表于:2007-09-20 14:46:1315楼 得分:0
按照你的逻辑
上面的代码明显的问题是
¦ ¦应该是&&
continue应该是break

如果想快一点的话就用xpath
好在你的属性不多只有3个
发表于:2007-09-20 14:48:4016楼 得分:0
还不清楚啊
<?xml   version= "1.0 "   encoding= "gb2312 "?>
<root>
    <item   previd= "97 "   keyid= "96 "   nextid= "95 "   />
</root>

就是在   xml   中新建一个节点前,   删除xml中与所要建的新节点重复的节点

判断   重复节点   的标准是   :
xml中   只要某节点存在两个以上的value   与   所要建的新节点中任意两个value相等
就视为重复节点


发表于:2007-09-20 15:00:1617楼 得分:0
这样的,用户要求   自已可以调整行的顺序就象excel一样,并能保存调整后的行的顺序,
因此我用了一个xml来存放移动行的位置   (每次只记录   所移动行前后的位置)

previd   表示   用户移动行后   前面行的id  
keyid     表示   用户移动行的id  
nextid   表示   用户移动行后   前面行的id  


<item   previd= "97 "   keyid= "96 "   nextid= "95 "   />     表示     id   96   前面是   97   后面是95
<item   previd= "97 "   keyid= "95 "   nextid= " "   />         表示     id   95   前面是   97   后面没有行

为也加载行顺序时能更快而减少xml的大小,同时避免混乱,   需要去掉   有两个id相同的item,
不管是否   属性是否相同


发表于:2007-09-20 15:01:5118楼 得分:0
纠正:
nextid   表示   用户移动行后   后面行的id
发表于:2007-09-20 15:02:3519楼 得分:0
大致代码如下:

xmldocument   xmldoc   =   new   xmldocument();
                        xmldoc.load( "e:\\1.xml ");
                        xmlnodelist   elist   =   xmldoc.documentelement.childnodes;
                        xmlelement   newelt   =   xmldoc.createelement( "item ");
                        string   previd   =   " ";
                        string   keyid   =   " ";
                        string   nextid   =   " ";
                        if   (previd.length   >   0   &&   keyid.length   >   0   ¦ ¦
                                previd.length   >   0   &&   nextid.length   >   0   ¦ ¦
                                keyid.length   >   0   &&   nextid.length)
                        {
                                //只有两个以上节点不为 " "的时候才判断,否则直接添加
                                string   xpath   =   string.format( "/root/item[1> 2   or   {0}] ",
                                        createxpath(previd,   keyid,   nextid));
                                xmlnode   node   =   doc.selectsinglenode(xpath);
                                if   (node   !=   null)
                                {
                                        //delete   node
                                }
                        }
                        //to   do   append   node


private   string   createxpath(string   property1,   string   property2)
                {
                        stringbuilder   sb   =   new   stringbuilder();
                        sb.append( "   or   ");
                        sb.append( "(@previd= '{0} '   and   @keyid= '{1} ')   or   (@previd= '{0} '   and   @nextid= '{1} ')   or   (@previd= '{1} '   and   @keyid= '{0} ')   or   (@previd= '{1} '   and   @nextid= '{0} ') ");
                        return   sb.tostring();
                }

                private   string   createxpath(string   property1,   string   property2,   string   property3)
                {
                        stringbuilder   sb   =   new   stringbuilder();
                        if   (property1.length   >   0   &&   property2.length   >   0)
                        {
                                sb.append(createxpath(property1,   property2));
                        }
                        if   (property1.length   >   0   &&   property3.length   >   0)
                        {
                                sb.append(createxpath(property1,   property3));
                        }
                        if   (property2.length   >   0   &&   property3.length   >   0)
                        {
                                sb.append(createxpath(property2,   property3));
                        }
                        return   sb.tostring();
                }

你测试测试吧
大致的样子就是这样
上面的逻辑是只有两个以上节点不为 " "的时候才判断,否则直接添加
并且默认原xml文件是合法的
即没有 "重复节点 "
否则把selectsinglenode换成selectnodes
发表于:2007-09-20 15:05:0720楼 得分:0
xmldocument   xmldoc   =   new   xmldocument();
xmldoc.load( "e:\\1.xml ");
xmlnodelist   elist   =   xmldoc.documentelement.childnodes;
xmlelement   newelt   =   xmldoc.createelement( "item ");
----》
xmldocument   doc   =   new   xmldocument();
doc.load( "e:\\1.xml ");

添加节点的source和删除节点的source自己写
发表于:2007-09-20 15:06:2421楼 得分:0
sb.append( "(@previd= '{0} '   and   @keyid= '{1} ')   or   (@previd= '{0} '   and   @nextid= '{1} ')   or   (@previd= '{1} '   and   @keyid= '{0} ')   or   (@previd= '{1} '   and   @nextid= '{0} ') ");
------》
sb.appendformat( "(@previd= '{0} '   and   @keyid= '{1} ')   or   (@previd= '{0} '   and   @nextid= '{1} ')   or   (@previd= '{1} '   and   @keyid= '{0} ')   or   (@previd= '{1} '   and   @nextid= '{0} ') ",property1,property2);
发表于:2007-09-20 15:07:5822楼 得分:0
faint
又漏掉了

sb.appendformat( "(@previd= '{0} '   and   @keyid= '{1} ')   or   (@previd= '{0} '   and   @nextid= '{1} ')   or   (@previd= '{1} '   and   @keyid= '{0} ')   or   (@previd= '{1} '   and   @nextid= '{0} ') ",property1,property2);
-------------》
sb.appendformat( "(@previd= '{0} '   and   @keyid= '{1} ')   or   (@previd= '{0} '   and   @nextid= '{1} ')   or   (@previd= '{1} '   and   @keyid= '{0} ')   or   (@previd= '{1} '   and   @nextid= '{0} ')   or   (@keyid= '{0} '   and   @nextid= '{1} ')   or   (@keyid= '{1} '   and   @nextid= '{0} ') ",property1,property2);
发表于:2007-09-20 15:16:1123楼 得分:0
string   xpath   =   string.format( "/root/item[1> 2   or   {0}] ",
createxpath(previd,   keyid,   nextid));
->
string   xpath   =   string.format( "/root/item[1> 2   {0}] ",
createxpath(previd,   keyid,   nextid));
发表于:2007-09-21 09:25:3324楼 得分:0
..


快速检索

最新资讯
热门点击