我是Visual Basic的新手,所以我想从一开始就原谅自己. 下面的代码应该得到一个节点列表,其中包含Name的InnerText等于名为membername的String的所有节点.这部分似乎工作得很好,但之后我还要检
下面的代码应该得到一个节点列表,其中包含Name的InnerText等于名为membername的String的所有节点.这部分似乎工作得很好,但之后我还要检查在这个列表中是否存在一个节点Logout.这样我想防止重复xml数据库中的数据.不幸的是,它不像我尝试的那样工作.它不断复制所有数据.那我的错是什么?
XML文件
<?xml version="1.0" encoding="utf-16"?> <Times> <Shift> <Name>Philipp</Name> <Login>14:11</Login> <Date>25.03.2013</Date> <Logout>14:11</Logout> ' Don't generate again .... </Shift> <Shift> <Name>Philipp</Name> <Login>14:11</Login> <Date>25.03.2013</Date> <Logout>14:11</Logout> ' Generate Logout node </Shift> </Times>
VISUAL BASIC CODE
If File.Exists(Filename) Then DOMDocument.Load(Filename) Dim RootElement As XmlElement = DOMDocument.DocumentElement Dim ListOfTitles As XmlNodeList = DOMDocument.GetElementsByTagName("Name") For Each Node As XmlNode In ListOfTitles If Node.InnerText = memberName Then Dim logout = Node.SelectNodes("Logout") If Not logout Is Nothing Then Dim NewElement As XmlElement = DOMDocument.CreateElement("Logout") NewElement.InnerText = DateTime.Now.ToShortTimeString() Dim Parent As XmlNode = Node.ParentNode Parent.AppendChild(NewElement) DOMDocument.Save(Filename) End If End If Next End If让我们试着解释什么是错的以及如何解决它.
显然,对于每个< Name>节点,您希望检索< Logout>节点.与之关联的节点(如果存在),并尝试使用Node.SelectNodes(“Logout”)执行此操作,但是:
代码Node.SelectNodes(“Logout”)实际上尝试选择< Name>的子节点.您的Node变量表示的节点 – 在XML标记中,
><名称>节点没有子节点
><退出>节点总是他们的兄弟姐妹,而不是孩子.
所以它总是返回一个空集合,而不是你想要的节点.
您可以通过迭代< Shift>来解决此问题.节点,因为它们包含Name和Logout信息作为子节点.
顺便说一句,InnerText不是IXMLDOMNode属性,请尝试使用Text
If File.Exists(Filename) Then DOMDocument.Load(Filename) Dim RootElement As XmlElement = DOMDocument.DocumentElement Dim ListOfShifts As XmlNodeList = DOMDocument.GetElementsByTagName("Shift") For Each ShiftNode As XmlNode In ListOfShifts Dim NameNode = ShiftNode.SelectSingleNode("Name") If NameNode IsNot Nothing And NameNode.Text = memberName Then Dim logoutNode = ShiftNode.SelectSingleNode("Logout") If Not logoutNode Is Nothing Then Dim NewElement As XmlElement = DOMDocument.CreateElement("Logout") NewElement.Text = DateTime.Now.ToShortTimeString() Dim Parent As XmlNode = Node.ParentNode Parent.AppendChild(NewElement) DOMDocument.Save(Filename) End If End If Next End If
此外,您将在每次更改时保存文档 – 为什么不在循环完成后仅保存一次