如何将子元素添加到ROOT [英] How to add a child element to the ROOT

查看:64
本文介绍了如何将子元素添加到ROOT的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

-----这个代码工作----



  string  [] lines = File.ReadAllLines( @  C:\Temp \ CSVFile.csv< /跨度>); 

XElement xml = new XElement( Root

new XElement( 用户
来自 str lines
let columns = str.Split(' ,'

select new XElement( user
new XElement( userid,列[ 0 ]),
new XElement( 用户名,列[ 1 ]),
new XElement( groupcuid,列[ 3 ])




);



--OUTPUT -

  <   root  >  
< 用户 >
< 用户 >
< userid > drese < / userid >
< 用户名 > 连衣裙dlasns < / username >
< groupcuid > art < / groupcuid >
< / user >







---我想要的是添加< groups>孩子所以输出看起来像这样---

 <   root  >  
< 用户 >
< user >
< userid > drese < / userid >
< 用户名 > 着装dlasns < / username >
< groupcuid > art < / groupcuid >
< / user >
< span class =code-keyword>< gropus >
< group >
< gropuid > eng < span class =code-keyword>< / gropuid > < / group > ;









---所以我试过这但它没有创建GROUP部分 -

  string  [] lines = File.ReadAllLines(  @  C:\Temp \CSVFile.csv); 

XElement xml = new XElement( Root

new XElement( 用户
来自 str lines
let columns = str.Split(' ,'

select new XElement( user
new XElement( userid,列[ 0 ]),
new XElement( username,columns [ 1 ]),
new XElement( groupcuid,列[ 3 ])




);
XElement xml = new XElement( Root

new XElement( Groups
来自 str
columns = str.Split(' , '

选择 XElement( group
new XElement(< span class =code-string>
groupid,列[ 0 ]) ,





);





我尝试了什么:



添加了

 XElement xml =  new  XElement(  Root
new XElement( Groups





但是这会让孩子进入USERS而不是ROOT

解决方案

I想知道XElement是如何工作的'层次结构' - 我认为你可能更好地从XMLDocument开始 - 所以我敲了一个非常快速的实验 - 非常手动,并且我已经消除了Top XML声明...



 使用系统; 
使用 System.Xml;

命名空间 XMLDocTest
{
class Program
{
静态 void Main( string [] args)
{
XmlDocument doc = new XmlDocument();
XmlNode docNode = doc.CreateXmlDeclaration( 1.0 UTF-8 null );
doc.AppendChild(docNode);

XmlNode rootNode = doc.CreateElement( Root);
doc.AppendChild(rootNode);

XmlNode usersNode = doc.CreateElement( users);
rootNode.AppendChild(usersNode);

XmlNode userNode = doc.CreateElement( user);
usersNode.AppendChild(userNode);

XmlNode useridNode = doc.CreateElement( userid);
useridNode.AppendChild(doc.CreateTextNode( 0001));
userNode.AppendChild(useridNode);

XmlNode usernameNode = doc.CreateElement( username);
usernameNode.AppendChild(doc.CreateTextNode( rastus));
userNode.AppendChild(usernameNode);

userNode = doc.CreateElement( user);
usersNode.AppendChild(userNode);

useridNode = doc.CreateElement( userid);
useridNode.AppendChild(doc.CreateTextNode( 0002));
userNode.AppendChild(useridNode);

usernameNode = doc.CreateElement( username);
usernameNode.AppendChild(doc.CreateTextNode( jasper));
userNode.AppendChild(usernameNode);

XmlNode groupsNode = doc.CreateElement( groups);
rootNode.AppendChild(groupsNode);

XmlNode groupNode = doc.CreateElement( group);
groupsNode.AppendChild(groupNode);

XmlNode groupidNode = doc.CreateElement( groupid);
groupidNode.AppendChild(doc.CreateTextNode( ABC));
groupNode.AppendChild(groupidNode);

groupNode = doc.CreateElement( group);
groupsNode.AppendChild(groupNode);

groupidNode = doc.CreateElement( groupid);
groupidNode.AppendChild(doc.CreateTextNode( DEF));
groupNode.AppendChild(groupidNode);

doc.Save(Console.Out);
}
}
}





给出: -



 <   root  >  
< 用户 >
< user < span class =code-keyword>>
< userid > 0001 < / userid < span class =code-keyword>>
< 用户名 > rastus < / username < span class =c ode-keyword>>
< / user >
< 用户 >
< userid < span class =code-keyword>> 0002 < / userid >
< 用户名 < span class =code-keyword>> jasper < / username >
< / user >
< / users >
< 群组 >
< group >
< groupid > ABC < / groupid >
< / group >
< group >
< ; groupid > DEF < / groupid >
< / group >
< / groups >
< / root >





哪个'看起来像'你想要的是什么呢? ...所以,我想知道你是否可以从我的代码到csv文件的填充(即,将用户节点包装在foreach中为你的用户csv行等)



我可能完全错了,这没有任何帮助....



[edit]

一种方法来替换这个



 XmlNode userNode = doc.CreateElement( 用户); 
usersNode.AppendChild(userNode);

XmlNode useridNode = doc.CreateElement( userid);
useridNode.AppendChild(doc.CreateTextNode( 0001));
userNode.AppendChild(useridNode);

XmlNode usernameNode = doc.CreateElement( username);
usernameNode.AppendChild(doc.CreateTextNode( rastus));
userNode.AppendChild(usernameNode);

userNode = doc.CreateElement( user);
usersNode.AppendChild(userNode);

useridNode = doc.CreateElement( userid);
useridNode.AppendChild(doc.CreateTextNode( 0002));
userNode.AppendChild(useridNode);

usernameNode = doc.CreateElement( username);
usernameNode.AppendChild(doc.CreateTextNode( jasper));
userNode.AppendChild(usernameNode);







可能是



 lines = File.ReadAllLines( @  C:\Temp\CSVFile.csv); 
// BoilerPlate向下添加每个用户
foreach string aFileLine 行)
{
userNode = buildUserNode(aFileLine);
usersNode.AppendChild(userNode)
}





你在哪里



 静态 XmlNode buildUserNode( string  fileLineIn) 
{
XmlNode tmpUserNode = new doc.CreateElement( 用户);
// 从拆分fileLineIn等构建用户节点
return XmlNode;
}





显然你可以为群组做同样的事情,无论你需要什么节点组

[/编辑]


----- THIS CODE WORKS ----

string[] lines = File.ReadAllLines(@"C:\Temp\CSVFile.csv");

     XElement xml = new XElement("Root",

         new XElement("Users",
         from str in lines
         let columns = str.Split(',')

         select new XElement("user",
         new XElement("userid", columns[0]),
         new XElement("username", columns[1]),
         new XElement("groupcuid", columns[3])


              )
        )
        );


--OUTPUT --

<root>
  <users>
      <user>
      <userid>drese</userid>
      <username>dress dlasns</username>
      <groupcuid>art</groupcuid>
    </user>




--- What I want is to add the <groups> child so output look like this---

<root>
  <users>
      <user>
      <userid>drese</userid>
      <username>dress dlasns</username>
      <groupcuid>art</groupcuid>
    </user>	
<gropus>
<group>
<gropuid>eng</gropuid></group>





---So I tried this BUT it does not create the GROUP part--

string[] lines = File.ReadAllLines(@"C:\Temp\CSVFile.csv");
            
            XElement xml = new XElement("Root",
                
                new XElement("Users",
                from str in lines
                let columns = str.Split(',')
                   
                select new XElement("user", 
                new XElement("userid", columns[0]),
                new XElement("username", columns[1]),
                new XElement("groupcuid", columns[3])
                
          
                     )
               )
               );
XElement xml = new XElement("Root",
                
                new XElement("Groups",
                from str in lines
                let columns = str.Split(',')
                   
                select new XElement("group", 
                new XElement("groupid", columns[0]),
                
                
          
                     )
               )
               );



What I have tried:

Added the

XElement xml = new XElement("Root",
new XElement("Groups",



but this puts the child inside the USERS not the ROOT

解决方案

I was wondering how XElement worked wrt 'hierarchy' - I thought you might have been better starting with XMLDocument - so I knocked up a very quick experiment - very manual, and Ive muffed up the Top XML declaration ...

using System;
using System.Xml;

namespace XMLDocTest
{
    class Program
    {
        static void Main(string[] args)
        {
            XmlDocument doc = new XmlDocument();
            XmlNode docNode = doc.CreateXmlDeclaration("1.0", "UTF-8", null);
            doc.AppendChild(docNode);

            XmlNode rootNode = doc.CreateElement("Root");
            doc.AppendChild(rootNode);

            XmlNode usersNode = doc.CreateElement("users");
            rootNode.AppendChild(usersNode);

            XmlNode userNode = doc.CreateElement("user");
            usersNode.AppendChild(userNode);

            XmlNode useridNode = doc.CreateElement("userid");
            useridNode.AppendChild(doc.CreateTextNode("0001"));
            userNode.AppendChild(useridNode);

            XmlNode usernameNode = doc.CreateElement("username");
            usernameNode.AppendChild(doc.CreateTextNode("rastus"));
            userNode.AppendChild(usernameNode);

            userNode = doc.CreateElement("user");
            usersNode.AppendChild(userNode);

            useridNode = doc.CreateElement("userid");
            useridNode.AppendChild(doc.CreateTextNode("0002"));
            userNode.AppendChild(useridNode);

            usernameNode = doc.CreateElement("username");
            usernameNode.AppendChild(doc.CreateTextNode("jasper"));
            userNode.AppendChild(usernameNode);

            XmlNode groupsNode = doc.CreateElement("groups");
            rootNode.AppendChild(groupsNode);

            XmlNode groupNode = doc.CreateElement("group");
            groupsNode.AppendChild(groupNode);

            XmlNode groupidNode = doc.CreateElement("groupid");
            groupidNode.AppendChild(doc.CreateTextNode("ABC"));
            groupNode.AppendChild(groupidNode);

            groupNode = doc.CreateElement("group");
            groupsNode.AppendChild(groupNode);

            groupidNode = doc.CreateElement("groupid");
            groupidNode.AppendChild(doc.CreateTextNode("DEF"));
            groupNode.AppendChild(groupidNode);

            doc.Save(Console.Out);
        }
    }
}



which gives :-

<root>
  <users>
    <user>
      <userid>0001</userid>
      <username>rastus</username>
    </user>
    <user>
      <userid>0002</userid>
      <username>jasper</username>
    </user>
  </users>
  <groups>
    <group>
      <groupid>ABC</groupid>
    </group>
    <group>
      <groupid>DEF</groupid>
    </group>
  </groups>
</root>



Which is 'looking like' what you're trying for isnt it ? ... so, I wonder if you can get from my code to your populating from a csv file (ie, wrapping the user node in a foreach for your user csv lines etc)

I could be completly wrong and this no help whatsoever ....

[edit]
one approach to replacing this

XmlNode userNode = doc.CreateElement("user");
usersNode.AppendChild(userNode);
 
            XmlNode useridNode = doc.CreateElement("userid");
            useridNode.AppendChild(doc.CreateTextNode("0001"));
            userNode.AppendChild(useridNode);
 
            XmlNode usernameNode = doc.CreateElement("username");
            usernameNode.AppendChild(doc.CreateTextNode("rastus"));
            userNode.AppendChild(usernameNode);
 
            userNode = doc.CreateElement("user");
            usersNode.AppendChild(userNode);
 
            useridNode = doc.CreateElement("userid");
            useridNode.AppendChild(doc.CreateTextNode("0002"));
            userNode.AppendChild(useridNode);
 
            usernameNode = doc.CreateElement("username");
            usernameNode.AppendChild(doc.CreateTextNode("jasper"));
            userNode.AppendChild(usernameNode);




may be

 lines=File.ReadAllLines(@"C:\Temp\CSVFile.csv");
// BoilerPlate Down to Adding Each User
foreach (string aFileLine in lines)
{
   userNode = buildUserNode(aFileLine);
   usersNode.AppendChild(userNode)
}



where you have

static XmlNode buildUserNode(string fileLineIn)
{
   XmlNode tmpUserNode = new doc.CreateElement("user");
   // Build user node from splitting fileLineIn etc
   return XmlNode;
}



obviously you can do the same for groups, whatever node groups you require
[/edit]


这篇关于如何将子元素添加到ROOT的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆