VBを使用して、XMLの内容を変更するには?

解決


たかし  2003-03-31 21:54:38  No: 77482

たかしと申します。
宜しくお願い致します。

以下のようなXMLファイルがあります。

<sample>
  <test>文字列</test>
</sample>

上記の「文字列」の部分を、Domを使用し変更したいのですが、できません。
ご存知の方がおりましたら、ご教授お願い致します。
また、以下にソースを記述致します。
ご指摘お願い致します。

If xNode.nodeType = NODE_ELEMENT Then
    If xNode.nodeName = "sample"
                   
       If xNode.nodeName = "test" Then
            'ここで変更したいのですが、うまくいきません。
            Nodes.Item(0).firstChild.nodeValue = "変更文字列"
       End If
    End If
End If


魔界の仮面弁士  2003-03-31 22:46:14  No: 77483

>    If xNode.nodeName = "sample"
>                   
>       If xNode.nodeName = "test" Then

1) Thenが足りません。
2) xNode.nodeNameの値が、"sample" と "test" の両方に一致する事は
   ありえませんので、上記の内側のIf文は実行されません。

# 間に、『Set xNode = xNode.firstChild』があるのかな?

>           'ここで変更したいのですが、うまくいきません。
>           Nodes.Item(0).firstChild.nodeValue = "変更文字列"

Nodesというのは、恐らくノードリストを指しているのだとは思いますが、
この時点では、具体的にどのノードリストを表わしているのかが不明瞭なので、
何とも言えません。

ただ、少なくとも手元のMXSML4では、nodeValueプロパティやtextプロパティを
使って、テキストノードの値を修正することができました。


たかし  2003-04-01 00:47:57  No: 77484

魔界の仮面弁士さんありがとうございます。
誤ったソースを記述してしまい大変申し訳ございませんでした。
実際のソースは、
Public Sub Gethonbundata()

    Dim xDoc As MSXML.DOMDocument
    Set xDoc = New MSXML.DOMDocument
    xDoc.validateOnParse = False

    If xDoc.Load("・・・test.xml") Then
        '関数呼出
        InchonbunData xDoc.childNodes, 0
    Else
    End If
End Sub

Public Sub InchonbunData(ByRef Nodes As MSXML.IXMLDOMNodeList, _
    ByVal Indent As Integer)

    Dim xNode As MSXML.IXMLDOMNode
    Dim textdata As String

    Indent = Indent + 2
    For Each xNode In Nodes
        If xNode.nodeType = NODE_ELEMENT Then
            If xNode.nodeName = "test" Then
               'ここで変更したいのですが、うまくいきません。
               Nodes.Item(0).firstChild.nodeValue = "変更文字列"
            End If
        End If
        If xNode.hasChildNodes Then
            InchonbunData xNode.childNodes, Indent
        End If
    Next xNode
End Sub

です。これを実行し、XMLファイルを開いてみると、「文字列」のままと
なってしまいます。

大変申し訳ございませんが、ご教授お願い致します。


魔界の仮面弁士  2003-04-01 01:58:22  No: 77485

>     If xDoc.Load("・・・test.xml") Then
この前に、asyncプロパティを設定しましょう。

> Public Sub InchonbunData(ByRef Nodes As MSXML.IXMLDOMNodeList, _
>     ByVal Indent As Integer)

第2引数だけでなく、第1引数もByValで良いかと思います。

>            If xNode.nodeName = "test" Then
>                Nodes.Item(0).firstChild.nodeValue = "変更文字列"
>            End If
これでも誤りではありませんが、折角、ノードを列挙しているのから、
わざわざノードリストから辿らなくても、
  xNode.text = "変更文字列"
で十分かと思います。

MSXML独自のメソッドを使わず、W3C標準仕様のメソッドだけで書くなら、
  If xNode.firstChild.nodeType = NODE_TEXT Then
      xNode.firstChild.nodeValue = "変更文字列"
  End If
といったところですかね。

> です。これを実行し、XMLファイルを開いてみると、「文字列」のままと

まず、DOMDocumentの内容が編集されているかどうかを確かめてみてください。
内容の確認には、xmlプロパティが利用できます。
   Debug.Print xDoc.documentElement.xml

もし、DOMDocument自体は編集されていたとしたら、それをXMLファイルに
saveする部分のコードに問題があるのだと思います。


たかし  2003-04-01 04:45:17  No: 77486

魔界の仮面弁士さん、ありがとうございました。
魔界の仮面弁士さんがおっしゃるとおり、saveする部分に
問題がありました。

本当にありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加