创建XML节点

时间:2013-10-04 12:21:03

标签: xml vb.net treeview

我有以下XML文件,我想在第一个<Profile_Path></Profile_Path>节点下添加一个新子项。

原始XML:

<?xml version="1.0" encoding="utf-8"?>
<Profiles>
  <Profile>
    <Profile_Name>Profile 1</Profile_Name>
    <Profile_Path>E:\Test</Profile_Path>
  </Profile>
  <Profile>
    <Profile_Name>Profile 2</Profile_Name>
    <Profile_Path>E:\Test</Profile_Path>
  </Profile>
</Profiles>

运行代码后......

Public Sub CreateProjectXml()

    ProfileList.Load(xml_path)
    Dim profilesNode As XmlNode = ProfileList.SelectSingleNode("Profiles")
    Dim profiles As XmlNodeList = profilesNode.SelectNodes("Profile")
    Dim profile As XmlNode = profiles(2)

    Dim project_info As XmlElement = ProfileList.CreateElement("Project_Name")

    project_info.InnerText = "Project 1"
    ProfileList.DocumentElement.AppendChild(project_info)

    ProfileList.Save(xml_path)

End Sub

我得到以下结果:

    <?xml version="1.0" encoding="utf-8"?>
    <Profiles>
      <Profile>
        <Profile_Name>Profile 1</Profile_Name>
        <Profile_Path>E:\Test</Profile_Path>
      </Profile>
      <Profile>
        <Profile_Name>Profile 2</Profile_Name>
        <Profile_Path>E:\Test</Profile_Path>
      </Profile>
      <Project_Name>Project 1</Project_Name>
    </Profiles>

请用正确的代码帮助我!

3 个答案:

答案 0 :(得分:2)

第一个问题是您通过致电ProfileList.DocumentElement.AppendChild来追加孩子。该方法会将子项附加到document元素,该元素是根级Profiles元素。如果要将子项追加到第一个Profile元素,则需要将其更改为:

Public Sub CreateProjectXml()
    ProfileList.Load(xml_path)
    Dim profilesNode As XmlNode = ProfileList.SelectSingleNode("Profiles")
    Dim profiles As XmlNodeList = profilesNode.SelectNodes("Profile")
    Dim profile As XmlNode = profiles(0)
    Dim project_info As XmlElement = ProfileList.CreateElement("Project_Name")
    project_info.InnerText = "Project 1"
    profile.AppendChild(project_info)
    ProfileList.Save(xml_path)
End Sub

请注意,在上面的示例中,我将其更改为使用profiles(0)而不是profiles(2),这样它将使用第一个而不是第三个。

但是,值得一提的是SelectNodesSelectSingleNode使用XPath。这意味着你可以通过只选择你真正想要的一个元素来大大简化你的逻辑,例如,如果你想要的只是第一个Profile元素,你可以这样做:

Public Sub CreateProjectXml()
    ProfileList.Load(xml_path)
    Dim profile As XmlNode = ProfileList.SelectSingleNode("Profiles/Profile")
    Dim project_info As XmlElement = ProfileList.CreateElement("Project_Name")
    project_info.InnerText = "Project 1"
    profile.AppendChild(project_info)
    ProfileList.Save(xml_path)
End Sub

SelectSingleNode方法只会返回第一个匹配元素,因此您不需要在XPath中指定索引,但如果您想更明确,则可以指定索引仅获取第一个,像这样:

Dim profile As XmlNode = ProfileList.SelectSingleNode("Profiles/Profile[1]")

或者,如果您想获得第三个Profile元素,则可以使用此XPath:

Dim profile As XmlNode = ProfileList.SelectSingleNode("Profiles/Profile[3]")

或者,如果您想获得Profile等于“个人资料2”的Profile_Name元素,您可以这样做:

Dim profile As XmlNode = ProfileList.SelectSingleNode("Profiles/Profile[Profile_Name='Profile 2']")

等。如果您打算使用XML,那么花一些时间学习XPath的基础知识是非常值得的。 XPath是一种标准的XML查询语言,可用于许多XML工具和编程语言。例如,如果您要使用XSLT,则需要了解XPath。如上所述,XPath可以与XmlDocument类一起使用,也可以与较新的XDocument类一起使用。

XPath的替代方法是使用LINQ。 LINQ是一项专有的Microsoft技术,因此您不会在.NET之外的其他工具和语言中找到任何支持,但许多人确实更喜欢它。新的XDocument类旨在通过LINQ使XML易于使用。结合VB.NET对内联XML文字的支持,使用XDocument实现此任务非常简单:

Dim doc As XDocument = XDocument.Load(xml_path)
doc.<Profiles>.<Profile>(0).Add(<Project_Name>Project 1</Project_Name>)
doc.Save(xml_path)

答案 1 :(得分:0)

Alex我认为您应该使用以下代码

ProfileList.DocumentElement.InsertAfter(project_info, profiles.FirstChild)

而不是

ProfileList.DocumentElement.AppendChild(project_info)

答案 2 :(得分:0)

由于您使用的是VB.Net,因此您可以轻松地使用XML。

Dim xml = <?xml version="1.0" encoding="utf-8"?>
            <Profiles>
                <Profile>
                    <Profile_Name>Profile 1</Profile_Name>
                    <Profile_Path>E:\Test</Profile_Path>
                </Profile>
                <Profile>
                    <Profile_Name>Profile 2</Profile_Name>
                    <Profile_Path>E:\Test</Profile_Path>
                </Profile>
            </Profiles>

xml...<Profile>.First().Add(<Project_Name>Project 1</Project_Name>)

现在xml

<Profiles>
  <Profile>
    <Profile_Name>Profile 1</Profile_Name>
    <Profile_Path>E:\Test</Profile_Path>
    <Project_Name>Project 1</Project_Name>
  </Profile>
  <Profile>
    <Profile_Name>Profile 2</Profile_Name>
    <Profile_Path>E:\Test</Profile_Path>
  </Profile>
</Profiles>

所以你基本上只需要这个:

Public Sub CreateProjectXml()
    ProfileList.Load(xml_path)
    ProfileList...<Profile>.First().Add(<Project_Name>Project 1</Project_Name>)
    ProfileList.Save(xml_path)
End Sub