- PR -

指定ノードの要素の更新について

投稿者投稿内容
かもがや
大ベテラン
会議室デビュー日: 2004/08/31
投稿数: 103
投稿日時: 2004-11-05 18:05
お世話になっております。

<?xml version="1.0" encoding="Shift_JIS"?>
<HogeRoot>
<HogeChild ID="1">
<grandchild>孫1</grandchild>
</HogeChild>
<HogeChild ID="2">
<grandchild>孫2</grandchild>
</HogeChild>
<HogeChild ID="3">
<grandchild>孫3</grandchild>
</HogeChild>
<HogeChild ID="4">
<grandchild>孫4</grandchild>
</HogeChild>
<HogeChild ID="5">
<grandchild>孫5</grandchild>
</HogeChild>
</HogeRoot>

なるXMLファイル中の『HogeChild ID="1"』の、下位ノードである『grandchild』
の要素『孫1』を『孫新1』に更新させようと以下のようなコードを書いて試して
みました。

Dim xDoc As New XmlDocument
xDoc.Load("test.xml")
Dim xPathString As String = "HogeRoot" + "/HogeChild ID=" + Chr(34) + "1" + Chr(34) + "/grandchild"
Dim List As XmlNodeList = xDoc.GetElementsByTagName(xPathString)
Dim i As Integer
For i = 0 To List.Count - 1
Dim replaceNode As XmlElement = xDoc.CreateElement("孫新1")
List.Item(i).ParentNode.ReplaceChild(replaceNode, List.Item(i))
Next

xDoc.Save("test.xml")

結果は何も変わらず・・・です。

識者の方、マズい箇所のご指摘を頂ければ幸いです。
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2004-11-05 18:44
そのままコピペして実行すると
XPathからListを取得できてないのですが。。。。
デバッグでおいましたか?
かもがや
大ベテラン
会議室デビュー日: 2004/08/31
投稿数: 103
投稿日時: 2004-11-05 19:01
レスありがとうございます。
おっしゃるとおりListが取得できていませんでした。
そこでXPathを以下のように変更し

Dim xPathString As String = "descendant::HogeChild [@ID='" + "1" + "']"

GetElementsByTagNameもSelectNodesに変えてみました。

Dim List As XmlNodeList = xDoc.SelectNodes(xPathString)

今度はListが取得できるようになったものの

Dim replaceNode As XmlElement = xDoc.CreateElement("孫新1")

で例外が発生。

難しいですね・・・
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2004-11-05 19:05
『孫1』を『孫新1』に変更したいなら
Dim replaceNode As XmlElement = xDoc.CreateElement("grandchild")
replaceNode.InnerText = "孫新1"
なのでは?
かもがや
大ベテラン
会議室デビュー日: 2004/08/31
投稿数: 103
投稿日時: 2004-11-05 19:28
レスありがとうございます。

引用:

burton999さんの書き込み (2004-11-05 19:05) より:
『孫1』を『孫新1』に変更したいなら
Dim replaceNode As XmlElement = xDoc.CreateElement("grandchild")
replaceNode.InnerText = "孫新1"
なのでは?



我ながらなんと間抜けな・・、おっしゃるとおりです。
かもがや
大ベテラン
会議室デビュー日: 2004/08/31
投稿数: 103
投稿日時: 2004-11-05 19:34
そこで再実行してみると


<?xml version="1.0" encoding="Shift_JIS"?>
<HogeRoot>
<grandchild>孫新1</grandchild>
<HogeChild ID="2">
<grandchild>孫2</grandchild>
</HogeChild>
<HogeChild ID="3">
<grandchild>孫3</grandchild>
</HogeChild>
<HogeChild ID="4">
<grandchild>孫4</grandchild>
</HogeChild>
<HogeChild ID="5">
<grandchild>孫5</grandchild>
</HogeChild>
</HogeRoot>

ノードのつかみ方が悪いのでしょうか・・

それともInnerTextにつかんだノード(タグ)もセットするのが正しいのでしょうか?・・

とりあえず?後者の方法で確かめてみます。
とっと
大ベテラン
会議室デビュー日: 2004/03/25
投稿数: 197
投稿日時: 2004-11-05 20:13
こんにちは。

予めIDが分かっているなら

Dim AAA As XmlNode

AAA = xmldoc.SelectNode("HogeRoot/HogeChild[ID=1]/grandchild")

AAA.InnerText = "孫新1"

xDoc.Save("test.xml")


でもいけますよ。

Dim List As XmlNodeList = xDoc.SelectNodes(xPathString)

でNodeListを取得したなら

List(index).InnerText = "孫新1"

でOKです

かもがや
大ベテラン
会議室デビュー日: 2004/08/31
投稿数: 103
投稿日時: 2004-11-06 15:49
おお、ありがとうございます(TT)

引用:

AAA = xmldoc.SelectNode("HogeRoot/HogeChild[ID=1]/grandchild")



こういうXPATHの書き方があるのですね。
ちゃんと理解していないもので。

勉強させていただきます。

スキルアップ/キャリアアップ(JOB@IT)