[英]VB.NET having trouble writing a string into a root node
Dim doc As New XmlDocument()
Dim nodes As XmlNodeList
doc.Load("test.xml")
nodes = doc.SelectNodes("/Subjects/" & comboSubject.Text)
Dim fileName As String = IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "test.xml")
Dim Rows As List(Of DataGridViewRow) =
gridTests.Rows.Cast(Of DataGridViewRow).Where(Function(row) Not row.IsNewRow).ToList
Dim xmlData As String =
<<%= comboSubject.Text %>>
<%= From row In Rows
Select
<attempt>
<test><%= CStr(row.Cells("Test").Value) %></test>
<score><%= CStr(row.Cells("Score").Value) %></score>
</attempt> %>
</>.ToString
For Each node As XmlNode In nodes
If node IsNot Nothing Then
node.ParentNode.RemoveChild(node)
doc.Save("test.xml")
End If
Next
如何将 xmlData 字符串写入 Subjects 节点?
<?xml version="1.0" encoding="UTF-8"?>
<Subjects>
<History>
<attempt>
<test>1999</test>
<score>75</score>
</attempt>
<attempt>
<test>1987</test>
<score>50</score>
</attempt>
<attempt>
<test>1789</test>
<score>25</score>
</attempt>
</History>
</Subjects>
每当我尝试将 XmlData 字符串写入 test.xml 时,它最终要么删除所有内容,要么什么都不做。 我不确定我在这里做错了什么。 对此的任何解决方案将不胜感激。
我看到几个问题...
Dim xmlData As String =
<<%= comboSubject.Text %>>
<%= From row In Rows
Select
<attempt>
<test><%= CStr(row.Cells("Test").Value) %></test>
<score><%= CStr(row.Cells("Score").Value) %></score>
</attempt> %>
</>.ToString
这似乎没有生成有效的 XML,因为标签没有正确关闭。 例如,它应该是</History>
而不是</>
此外,除了将它存储在 xmlData 变量中之外,您没有对这个 XML 做任何事情。 从未使用过该变量。 您只需 go 就可以删除现有节点,这就是为什么您看到它“删除所有内容”
For Each node As XmlNode In nodes
If node IsNot Nothing Then
node.ParentNode.RemoveChild(node)
doc.Save("test.xml")
End If
Next
doc
代表您的整个文档, node
将是,例如, /Subjects/History
所以当您说node.ParentNode.RemoveChild(node)
时,您正在从其父Subjects
节点中删除History
节点,只留下<Subjects/>
被保存. 此循环还会为不必要的每次迭代调用 save,但这既不在这里也不在那里。
最后,如前所述,您不会在任何地方将xmlData
写回文档。 对于如何做到这一点没有很好的答案,因为 XML 并不意味着以这种方式构建为字符串。 您可以使用XmlNode.InnerXml属性直接更改元素的标记,但正如 Microsoft 在文档中指出的那样,这不是一个好主意。 您还可以将该字符串解析为 XML object,但理想情况下,您应该只为正在创建的每个元素构造 Node 对象,然后将它们添加到适当位置的doc
中。 像这样的东西,例如:
Dim objHistory as XmlElement = doc.CreateElement("History")
Dim objAttempt As XmlElement = doc.CreateElement("attempt")
Dim objTest As XmlElement = doc.CreateElement("test")
Dim objScore as XmlElement = doc.CreateElement("score")
objTest.InnerText = "1999"
objScore.InnerText = "75"
objAttempt.AppendChild(objTest)
objAttempt.AppendChild(objScore)
objHistory.AppendChild(objAttempt)
doc.FirstChild.AppendChild(objHistory)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.