VB.NET中遍历XmlNodeList获取seg元素的技术求助
解决VB.NET遍历TMX文件中
<tu>节点并提取<seg>内容的问题 你遇到的问题其实是XPath路径的写法踩了个小坑——你用的/seg是绝对路径,它会从整个XML文档的根节点开始找<seg>,而不是从当前正在遍历的<tu>节点往下查找,所以自然拿不到对应节点下的内容。
我给你调整一下代码,同时补充一些实用的细节,方便你把数据存入数据库:
Dim tmxfile As String = "d:\Documents\Desktop\myxml.xml" Dim xmldoc As New XmlDocument xmldoc.Load(tmxfile) ' 获取所有<tu>节点集合 Dim tuNodes As XmlNodeList = xmldoc.DocumentElement.SelectNodes("//tu") ' 遍历每个<tu>节点,用For Each比索引循环更直观 For Each tuNode As XmlNode In tuNodes ' 先获取当前tu的属性信息(比如创建时间、修改时间),存数据库可能用得到 Dim createDate As String = tuNode.Attributes("creationdate")?.Value Dim changeDate As String = tuNode.Attributes("changedate")?.Value Dim context As String = tuNode.SelectSingleNode("./prop[@type='x-context']")?.InnerText ' 遍历当前tu下的每个<tuv>节点(每个tuv对应一种语言的译文) Dim tuvNodes As XmlNodeList = tuNode.SelectNodes("./tuv") For Each tuvNode As XmlNode In tuvNodes ' 获取语言标识 Dim lang As String = tuvNode.Attributes("xml:lang")?.Value ' 获取对应的seg内容 Dim segContent As String = tuvNode.SelectSingleNode("./seg")?.InnerText ' 这里就可以把数据存入数据库了,比如调用你的插入方法 ' SaveToDatabase(createDate, changeDate, context, lang, segContent) ' 临时弹窗查看结果 MsgBox($"语言:{lang} | 内容:{segContent} | 上下文:{context}") Next Next
关键知识点说明:
- 相对路径的写法:用
./tuv或者.//seg,开头的.表示从当前节点(也就是当前的<tu>)开始查找,而不是从文档根节点开始。如果结构固定,用./tuv/seg比.//seg更高效,因为它直接指定了层级。 - 空值保护:用
?.运算符可以避免节点或属性不存在时抛出空引用异常,比如如果某个<tu>没有x-context属性,tuNode.SelectSingleNode(...)?.InnerText会返回Nothing而不是崩溃。 - 精准匹配语言:如果需要单独提取某一种语言的内容,可以直接用XPath筛选,比如要拿英文内容:
tuNode.SelectSingleNode("./tuv[@xml:lang='en-gb']/seg")?.InnerText。
这样调整后,就能正确遍历每个<tu>节点,并提取对应语言的<seg>内容,方便你存入数据库啦。
内容的提问来源于stack exchange,提问作者daviddgz
相关产品推荐
相关产品推荐

