繁体   English   中英

VB.NET 无法将字符串写入根节点

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM