PAYATHON 2026

如何在 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(...) 返回非空白字符串,否则赋值后节点仍没有实际内容。如果价格必须符合数值格式,还需要单独验证返回值。上面的代码只检查内容是否为空,不验证价格是否有效。

备注:内容仅供参考。