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 型の属性を定義する情報が必要です。タイプ ID の属性は XSD スキーマまたは DTD で定義できますが、このバージョンの製品は DTD で定義された属性のみをサポートします。「ID」という名前の属性は、DTD で定義されていない限り、タイプ 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 に答える