如何将子元素添加到ROOT [英] How to add a child element to the 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屋!