VB.NET:使用 XDocument 在 XML 文件中添加/编辑/删除 XElement
Posted
技术标签:
【中文标题】VB.NET:使用 XDocument 在 XML 文件中添加/编辑/删除 XElement【英文标题】:VB.NET : Add/Edit/Delete an XElement inside XML file with XDocument 【发布时间】:2022-01-18 01:15:02 【问题描述】:我必须制作一个应用程序,我可以在其中访问 XML 文件中的元素,然后 add-modify-delete 其中一些并在 XML 中更新这些元素。我设法使用 XML 文件中的 XDocument 加载元素,但是我很难理解如何使用 XDocument 保存对 XML 文件的更改。
myfile.xml
<root>
<functions>
<function name="foo">
<description> "foofoofoo" </description>
</function>
<function name="bar">
<description> "barbarbar" </description>
</function>
</functions>
...
</root>
到目前为止,这是我一直在尝试使用 XDocument 的方法,但它实际上并没有保存任何内容。
app.vd 用于添加元素
...
xml = XDocument.Load(pathToXmlFile)
functions = From f In xml.Descendants("functions") Select f
functions.Append(New XElement("function",
New XAttribute("name", newName),
New XElement("description", newDescription)))
xml.Save(pathToXmlFile)
...
提前感谢您的帮助!
【问题讨论】:
在我看来functions
仍然是一个选定的序列。您可能需要使用functions.Single
来获取函数节点,然后您就可以附加到该节点。你有Option Strict On
吗?
我会使用:xml.Descendants("functions").FirstOrDefault().Add(New XElement("function", New XAttribute("name", newName), New XElement("description" , 新描述)));
【参考方案1】:
您可以使用 XmlSerialization 将对象放入具体的类中并修改和写回,非常简单
Imports System.IO
Imports System.Xml.Serialization
Xml 模型
<XmlRoot("root")>
Partial Public Class Root
<XmlArrayItem("function")>
Public Property functions() As List(Of [Function])
End Class
Partial Public Class [Function]
<XmlElement("description")>
Public Property Description() As String
<XmlAttribute("name")>
Public Property Name() As String
End Class
读取、修改、写入
Dim xml As Root
Dim serializer As New XmlSerializer(GetType(Root))
' read
Using sr As New StreamReader("myfile.xml")
xml = DirectCast(serializer.Deserialize(sr), Root)
End Using
' modify
xml.functions.Add(
New [Function]() With
.Name = "newName",
.Description = "newDescription")
' write
Using sw As New StreamWriter("myfile.xml")
serializer.Serialize(sw, xml)
End Using
【讨论】:
以上是关于VB.NET:使用 XDocument 在 XML 文件中添加/编辑/删除 XElement的主要内容,如果未能解决你的问题,请参考以下文章
使用 XDocument 和 Linq 读取 XML - 检查元素是不是为 NULL?