我正在遍历xml,我想在最后一个节点之后插入数据。
这是xml和我到目前为止的代码
任何帮助都会很棒
<User Name="">
<Option Name="Pass"></Option>
<Option Name="Group"></Option>
<Option Name="Bypass server userlimit">0</Option>
<Option Name="User Limit">0</Option>
<Option Name="IP Limit">0</Option>
<Option Name="Enabled">1</Option>
<Option Name="Comments"></Option>
<Option Name="ForceSsl">0</Option>
<IpFilter>
<Disallowed />
<Allowed />
</IpFilter>
<Permissions>
<Permission Dir="kk"
<Option Name="AutoCreate">0</Option>
</Permission>
</Permissions>
</User>
</Users>
XmlDocument xdcDocument = new XmlDocument();
xdcDocument.Load(@"C:\Users\Rob\Desktop\filezilla.xml");
XmlElement xelRoot = xdcDocument.DocumentElement;
XmlNodeList xnlNodes = xelRoot.SelectNodes("/User");
foreach (XmlNode xNode in xnlNodes)
{
//how do i loop to the user node and then insert afterwards?
}
答案 0 :(得分:1)
首先,您的XML必须有效,我已经为您的XML添加了2个修复程序,您将获得异常,告诉您错误的确切位置。
<Users>
<User Name="">
<Option Name="Pass"></Option>
<Option Name="Group"></Option>
<Option Name="Bypass server userlimit">0</Option>
<Option Name="User Limit">0</Option>
<Option Name="IP Limit">0</Option>
<Option Name="Enabled">1</Option>
<Option Name="Comments"></Option>
<Option Name="ForceSsl">0</Option>
<IpFilter>
<Disallowed />
<Allowed />
</IpFilter>
<Permissions>
<Permission Dir="kk">
<Option Name="AutoCreate">0</Option>
</Permission>
</Permissions>
</User>
</Users>
可以满足您要求的代码:
XmlDocument xdcDocument = new XmlDocument();
xdcDocument.Load("filezilla.xml");
XmlElement xelRoot = xdcDocument.DocumentElement;
// select the last node of type User
XmlNodeList xmlNodes = xelRoot.SelectNodes("/Users/User[last()]");
if (xmlNodes.Count == 1)
{
var node = xmlNodes[0];
// create your new node, whatever structure you want
var element = xdcDocument.CreateElement("NodeAfterLastUser");
// insert this node to the same parent after the last user
node.ParentNode.InsertAfter(element, node);
xdcDocument.Save("filezilla_result.xml");
}
结果:
<Users>
<User Name="">
<Option Name="Pass">
</Option>
<Option Name="Group">
</Option>
<Option Name="Bypass server userlimit">0</Option>
<Option Name="User Limit">0</Option>
<Option Name="IP Limit">0</Option>
<Option Name="Enabled">1</Option>
<Option Name="Comments">
</Option>
<Option Name="ForceSsl">0</Option>
<IpFilter>
<Disallowed />
<Allowed />
</IpFilter>
<Permissions>
<Permission Dir="kk">
<Option Name="AutoCreate">0</Option>
</Permission>
</Permissions>
</User>
<NodeAfterLastUser />
</Users>
主要提示: XPath语法选择的最后一个用户节点:/ Users / User [last()] 您可以在此处找到有关选择的更多示例和说明: http://www.w3schools.com/xpath/xpath_syntax.asp
然后只需添加你想要的元素,我在我的示例元素中使用名称NodeAfterLastUser创建了illlustration,但是这里应该放置你的节点。
祝你好运。答案 1 :(得分:1)
您的xml无效。将其修复为:
<Users>
<User Name="">
<Option Name="Pass"></Option>
<Option Name="Group"></Option>
<Option Name="Bypass server userlimit">0</Option>
<Option Name="User Limit">0</Option>
<Option Name="IP Limit">0</Option>
<Option Name="Enabled">1</Option>
<Option Name="Comments"></Option>
<Option Name="ForceSsl">0</Option>
<IpFilter>
<Disallowed />
<Allowed />
</IpFilter>
<Permissions>
<Permission Dir="kk">
<Option Name="AutoCreate">0</Option>
</Permission>
</Permissions>
</User>
</Users>
您可以使用Linq2Xml
var xDoc = XDocument.Load(filename);
xDoc.XPathSelectElement("/Users") //Find parent Node
.Add( new XElement("NewNode","NewValue")); //Add to parent as its last child
var newxml = xDoc.ToString();
输出结果为:
<Users>
<User Name="">
<Option Name="Pass"></Option>
<Option Name="Group"></Option>
<Option Name="Bypass server userlimit">0</Option>
<Option Name="User Limit">0</Option>
<Option Name="IP Limit">0</Option>
<Option Name="Enabled">1</Option>
<Option Name="Comments"></Option>
<Option Name="ForceSsl">0</Option>
<IpFilter>
<Disallowed />
<Allowed />
</IpFilter>
<Permissions>
<Permission Dir="kk">
<Option Name="AutoCreate">0</Option>
</Permission>
</Permissions>
</User>
<NewNode>NewValue</NewNode>
</Users>
PS:不要忘记包含命名空间
using System.Xml.XPath;
using System.Xml.Linq;