xml循环到最后一个节点并插入c#

时间:2015-07-24 19:37:06

标签: c# xml

我正在遍历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?
    }

2 个答案:

答案 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;