【问题标题】:XML - Move To Last ChildXML - 移动到最后一个孩子
【发布时间】:2014-02-05 16:39:12
【问题描述】:

我试图弄清楚如何选择当前选择的 xml 节点的最后一个子节点。我有点麻烦。

xml 文档是这样开始的

<project>
   <book>
    ...
   </book>
   <characters>
     <character>
      .....
     </character>
   </characters>
 </project>

我需要能够在字符内附加一个新的字符元素以及带有数据的子节点。

我使用了 if else 语句来判断字符节点是否存在和不存在。我正在研究它现在是否存在。基本上文档已经包含一个字符。

这是我现在正在使用的代码。

nav = nav.SelectSingleNode("/project/characters")
        nav.AppendChildElement("", "character", "", "")
        nav.SelectSingleNode("//project/characters/*[last()]")
        nav.AppendChildElement("", "name", "", characterName)
        nav.AppendChildElement("", "race", "", characterRace)
        nav.AppendChildElement("", "age", "", characterAge)
        nav.AppendChildElement("", "name", "", characterName)
        nav.AppendChildElement("", "race", "", characterRace)
        nav.AppendChildElement("", "age", "", characterAge)
        nav.AppendChildElement("", "gender", "", characterGender)
        nav.AppendChildElement("", "origin", "", characterOrigin)
        nav.AppendChildElement("", "eye", "", characterEyeColor)
        nav.AppendChildElement("", "hair", "", characterHairColor)
        nav.AppendChildElement("", "weight", "", characterWeight)
        nav.AppendChildElement("", "height", "", characterHeight)
        nav.AppendChildElement("", "occupation", "", characterOccupation)
        nav.AppendChildElement("", "birthmarks", "", characterBirthmarks)
        nav.AppendChildElement("", "piercings", "", characterPiercings)
        nav.AppendChildElement("", "tattoos", "", characterTattoos)
        nav.AppendChildElement("", "scars", "", characterScars)

        Do While counter < traitCount

            nav.AppendChildElement("", "trait", "", characterTraits.AsReadOnly(counter))

            counter = counter + 1
        Loop

        counter = 0

        Do While counter < habitCount

            nav.AppendChildElement("", "habit", "", characterHabits.AsReadOnly(counter))

            counter = counter + 1
        Loop

        nav.AppendChildElement("", "bio", "", characterBio)


        document.Save(ProjectDataMod.projectPathMod + ProjectDataMod.projectNameMod + ".xml")

任何帮助将不胜感激。感谢您的宝贵时间。

Jb.

【问题讨论】:

  • 您是在问如何选择最后一个子元素,无论发生了什么,还是您在问,具体来说,如何选择您刚刚附加的新子元素?
  • 我需要进入我刚刚附加的元素,或者进入所选节点的最后一个子节点,这将是我刚刚附加的节点,哈哈。到目前为止的代码在 的末尾添加了一个子节点 但它没有在该节点内附加元素......我需要在里面获取数据元素 等等新添加的子元素。

标签: .net xml vb.net xmldocument


【解决方案1】:

已编辑

您可以为此使用 XPath。如果我理解正确,您想要“字符”节点的最后一个子节点:

nav.SelectSingleNode( "//project/characters/*[last()]" )

如果你有多个字符节点,你可以这样做:

nav.SelectSingleNode( "//project/characters[last()]/*[last()]" )

获取最后一个字符节点的最后一个子节点。

【讨论】:

  • 不应该删除对 xpath count() 函数的调用吗?
  • 已编辑答案,我认为我误解了这个问题。
  • 这不太奏效。我做到了。 nav = nav.SelectSingleNode("/project/characters") nav.AppendChildElement("", "character", "", "") nav.SelectSingleNode("//project/characters/*[last()]") nav .AppendChildElement("", "name", "", characterName) 但这已创建。 一堆字符数据
  • 我有一个字符节点和一个子节点字符,以及与该字符有关的数据。现在我可以添加一个字符和数据,但我不知道如何在字符末尾附加一个字符节点和数据..
  • 抱歉,我更新了问题中的代码以符合我认为您的意思。它将子节点字符附加到字符,但它没有将数据写入正确的位置。它跳过新添加的节点并将其写入字符内。
【解决方案2】:

您可以考虑使用xpathquery 您的xml。它有一个内置函数来查找节点的最后一个子节点。

http://support.microsoft.com/kb/301220

【讨论】:

  • 知道这将如何工作。我对导航 xml 的知识一点都不了解.. 刚刚学习..
  • 最后一个链接显示了一个来自微软的示例项目,该项目教授它是如何工作的。
  • 我按照我的想法尝试了 Sweet Lou 的方法。请参阅问题中的更新代码。没有完全做到我想要的。它在字符中附加了字符节点,但没有在其中添加字符信息...我会尝试阅读您链接的文章...啊,如果您可以检查问题中的更新代码,也许您可​​以告诉我为什么它没有不行吗?感谢所有帮助和信息:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-18
  • 1970-01-01
  • 2013-03-12
  • 2012-02-09
  • 1970-01-01
  • 2018-02-12
相关资源
最近更新 更多