Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在将某个节点插入现有xml文档时,如何在该节点之后添加该节点?_Xml_Vb.net - Fatal编程技术网

在将某个节点插入现有xml文档时,如何在该节点之后添加该节点?

在将某个节点插入现有xml文档时,如何在该节点之后添加该节点?,xml,vb.net,Xml,Vb.net,我似乎无法使用XmlDocument方法在另一个节点之后添加一个节点。我尝试了XMLdocument的方法,但它们似乎不起作用 告诉我我需要什么 现有的xml文件如下所示: <?xml version="1.0" encoding="UTF-8"?> <FileZillaServer> <Groups/> <Users> <User Name="dbrown"> <Option Name="Pass"

我似乎无法使用XmlDocument方法在另一个节点之后添加一个节点。我尝试了
XMLdocument
的方法,但它们似乎不起作用 告诉我我需要什么

现有的xml文件如下所示:

 <?xml version="1.0" encoding="UTF-8"?>
 <FileZillaServer>
 <Groups/>
 <Users>
    <User Name="dbrown">
       <Option Name="Pass">2ac9cb7dc02b3c0083eb70898e549b63</Option>
       <IpFilter>
           <Disallowed/>
           <Allowed/>
      </IpFilter>
      <Permissions>
          <Permission Dir="C:\inetpub\wwwroot">
              <Option Name="FileRead">1</Option>
          </Permission>
      </Permissions>
      <SpeedLimits DlType="0" DlLimit="10" ServerDlLimitBypass="0" UlType="0" UlLimit="10" ServerUlLimitBypass="0">
          <Download/>
          <Upload/>
      </SpeedLimits>
    </User>
 </Users>
 <User Name="3">
    <Option Name="Pass"/>
    <IPFilter>
        <Disallowed/>
        <Allowed/>
    </IPFilter>
    <Permissions>
       <Permission Dir="C:\inetpub\wwwroot">
            <Option Name="FileRead"/>
       </Permission>
    </Permissions>
    <SpeedLimits DType="0" DLimit="10" ServerDLimitBypass="0" UType="0" ULimit="10" ServerULimitBypass="0">
         <Download/>
         <Upload/>
    </SpeedLimits>
    <PrivateFtpAccountId-3>55555</PrivateFtpAccountId-3>
    <PrivatePassword-3>test5</PrivatePassword-3>
    <PublicFtpAccountId-3>66666</PublicFtpAccountId-3>
    <PublicPassword-3>test6</PublicPassword-3>
  </User>
  </FileZillaServer>

关于…

看起来您正在创建要添加到文档中的新数据的“用户”节点,然后将其添加到文档末尾:

xmleUserNameRoot.SetAttribute("Name", strId)
myXmlDocument.DocumentElement.AppendChild(xmleUserNameRoot)
您需要做的是在现有文档中找到
Users
节点,然后将新的
User
节点添加到该节点

为此,您将获得子节点,然后找到
Users
,并将
.appendChild
添加到该节点

这应该会有所帮助

编辑

因此,知道xml文件的结构,并且
Users
节点是文档最后一个子节点的子节点,我可以使用以下代码访问该节点:

    Dim docNodes As XmlNodeList = myXmlDocument.LastChild.ChildNodes()

    For Each node As XmlNode In docNodes
        If node.Name = "Users" Then
            node.AppendChild(xmleUserNameRoot)
        End If
    Next
或者,由于知道
Users
节点是
FileZillaServer
节点的最后一个节点,而该节点又是文档的最后一个节点,因此您只需执行以下操作即可

myXmlDocument.LastChild.LastChild.AppendChild(xmleUserNameRoot)

这不是很灵活,但很有效

此行将选择myXmlDocument中的第一个用户元素作为xmlNodeFirstUser

在此处定义要插入的节点

Dim xmlNodeToInsert As XmlNode
这将在xml文档中的第一个用户元素之后插入要插入的节点

myXmlDocument.InsertAfter(xmlNodeToInsert, xmlNodeFirstUser)
使用.Net中的
XmlDocument
方法、
SelectSingleNode(string xpathExpression)
InsertAfter(XmlNode-toInsert,XmlNode-insertAfterMe)
的组合,您应该能够轻松地操作和遍历Xml文档:
您还应该查看XPath表达式,以选择所需的节点。

“获取第一个用户”。----->无法查看以获取第一个用户。我尝试了许多XmlDocument方法,但都没有成功在第一个用户之后添加整个用户名=“#”组。按enter键即可..哈哈。无论如何..是的,AppendChild代码不属于那里。一旦我找到用户节点,它就属于底部。我遇到的问题是,我尝试了大多数方法来查找用户childnode,但没有成功。我不确定我做错了什么…为了讨论,我基本上删除了那些方法调用尝试。如果我正确理解了您试图做的事情,您不需要找到用户子节点。您只需找到它的
Users
父节点,并将新节点附加到该节点的末尾,在这种情况下,它将被添加到第一个现有用户节点的下面。我选择了第一个解决方案,因为我实际上在示例xml文件中保留了许多节点,以保持文件的小尺寸以供讨论。所以第二种解决方案不会占上风,因为用户不会是最后一个节点……非常感谢。你知道如何处理属性吗?我正在尝试添加具有管道字符|的属性。例如:“xmleSpeedLimits.SetAttribute(“ServerU | LimitBypass”,“0”)它将不允许这样做。我试图转义它,但没有成功。我按照您的建议进行了尝试,但得到:未处理的异常:System.ArgumentException:引用节点不是此节点的子节点。我添加了:Dim xmlNodeFirstUser作为XmlNode=myXmlDocument。选择singlenode(//User),tha返回用户节点。我添加了:myXmlDocument.InsertAfter(xmleUserNameRoot,xmlNodeFirstUser)第一个参数定义为xmlement,因为我正在使用它。我认为这就是它失败的原因。除了尝试使用XmlNode而不是XmlElement之外,还可以尝试使用
myXmlDocument.DocumentElement.InsertAfter()
。编辑-通常,引用节点不是此节点的子节点的错误是xmlNoeFirstUser不是myXmlDocument的子节点。
Dim xmlNodeFirstUser As XmlNode = myXmlDocument.SelectSingleNode("//User")
Dim xmlNodeToInsert As XmlNode
myXmlDocument.InsertAfter(xmlNodeToInsert, xmlNodeFirstUser)