如何在 XmlDocument 中确保 price 节点存在且有值?
数据阿明
结论
空元素和缺失元素要分开处理。<price></price> 和 <price /> 都是已存在但没有内容的节点,直接给它们的 InnerText 赋值即可。只有在找不到 <price> 节点时,才需要创建并追加节点。
原代码遇到节点存在但内容为空的情况时,也会新建节点并追加,导致原来的空节点仍留在 XML 中。示例里,bk101 和 bk102 属于这种情况;bk103 缺少 <price>,bk104 则已有值。
修改方法
先查找并创建缺失的节点,再检查节点内容:
Private Function EnsureValidPrice(xmlDoc As XmlDocument) As XmlDocument
Dim bookNodes = xmlDoc.SelectNodes("//book")
For Each book As XmlNode In bookNodes
Dim priceNode As XmlNode = book.SelectSingleNode("price")
If priceNode Is Nothing Then
priceNode = xmlDoc.CreateElement("price")
book.AppendChild(priceNode)
End If
If String.IsNullOrWhiteSpace(priceNode.InnerText) Then
priceNode.InnerText = GetPrice(book.Attributes("id"))
End If
Next
Return xmlDoc
End Function
book.SelectSingleNode("price") 会查找当前 book 下的 price 子节点。找不到时,代码会创建并追加节点;找到时,则直接检查它的 InnerText。String.IsNullOrWhiteSpace 会把空字符串、空元素和只含空白字符的内容都视为无值。
注意事项
确保 GetPrice(...) 返回非空白字符串,否则赋值后节点仍没有实际内容。如果价格必须符合数值格式,还需要单独验证返回值。上面的代码只检查内容是否为空,不验证价格是否有效。
备注:内容仅供参考。
