在将某个节点插入现有xml文档时,如何在该节点之后添加该节点?
我似乎无法使用XmlDocument方法在另一个节点之后添加一个节点。我尝试了在将某个节点插入现有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
的方法,但它们似乎不起作用
告诉我我需要什么
现有的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)