1

我有一个类似于下面结构的 XML 文档。使用 Visual Basic 如何根据 Id 和名称在不同级别插入节点。

Xpath 允许我插入新节点还是只允许修改现有节点?例如,如果我想<BuildingPart Id="B012" Name="Bedroom" Type="Room"/>在“B011 浴室”之后添加,如何实现?

<Buildings>
    <BuildingPart Id="B001" Name="House">
        <BuildingPart Id="B002" Name="Level 1" Type="Level">
            <BuildingPart Id="B003" Name="Kitchen" Type="Room"/>
            <BuildingPart Id="B004" Name="Bedroom" Type="Room"/>
            <BuildingPart Id="B005" Name="Lounge" Type="Room"/>
            <BuildingPart Id="B006" Name="Bathroom" Type="Room"/>
        </BuildingPart>
        <BuildingPart Id="B007" Name="Level 2" Type="Level">
            <BuildingPart Id="B008" Name="Bedroom" Type="Room"/>
            <BuildingPart Id="B009" Name="Bedroom" Type="Room"/>
            <BuildingPart Id="B010" Name="Study" Type="Room"/>
            <BuildingPart Id="B011" Name="Bathroom" Type="Room"/>
        </BuildingPart>
    </BuildingPart>
</Buildings>

谢谢。

4

1 回答 1

2

尝试这个:

Dim doc As Xml.XmlDocument
Dim myNode As Xml.XmlNode

doc.Load(sFileName)

myNode = doc.GetElementById("B001").Clone()
myNode.Attributes("Id").Value = "B012"
myNode.Attributes("Name").Value = "Bedroom"
myNode.Attributes("Type").Value = "Room"

doc.GetElementById("B007").AppendChild(myNode)

编辑:

要从乞求创建节点而不进行克隆,只需:

myNode = doc.CreateElement("BuildingPart")

myNode.SetAttribute("Id", "B012")
myNode.SetAttribute("Name", "Bedroom")
myNode.SetAttribute("Type", "Room")

编辑:

如MSDN 文档中所见,您需要始终指定哪个元素是元素的 ID 才能使用GetElementById

DOM 实现必须具有定义哪些属性属于 ID 类型的信息。尽管可以在 XSD 模式或 DTD 中定义类型 ID 的属性,但此版本的产品仅支持在 DTD 中定义的属性。除非在 DTD 中如此定义,否则名为“ID”的属性不属于 ID 类型。未知属性是否为 ID 类型的实现预计将返回 Nothing。

为此,您可以在 xml 的开头添加以下代码:

<!DOCTYPE Buildings[
<!ELEMENT BuildingPart ANY>
<!ATTLIST BuildingPart Id ID #REQUIRED>]>

如果无法更改文件,则必须遍历元素并检查属性中的 id:

For Each elem As XmlElement In doc.GetElementsByTagName("BuildingPart")
    If elem.GetAttribute("Id").Equals("B007") Then
        elem.AppendChild(myNode)
        Exit For
    End If
Next
于 2013-06-14T14:45:16.653 回答