C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: vbでxml出力


(過去ログ 74 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■43454 / inTopicNo.1)  vbでxml出力
  
□投稿者/ まきお (1回)-(2009/11/10(Tue) 22:41:00)

分類:[.NET 全般] 

vb初心者です。ネットを参考にしてコーディングしています。
エクセル2007でxmlファイルを出力するマクロを作成についての質問です。
DOMを使っているのですが名前空間の部分で"読み取り専用のノードを編集しようとしました"というエラーがでます。

コード
Dim xmlDoc As MSXML2.DOMDocument
Dim xmlPI As MSXML2.DOMProcessingIntroduction
Dim xmlNode As MSXML2.DOMNode
Dim xmlAttr As MSXML2.DOMAttribute
Dim xmStr As String

Set xmlDoc = New MAXML2.DOMDocument
Set xmlPI = xmlDOC.appendChild(xmlDoc.createProcessingIntroduction("xml","version=""1.0"",encording=""utf-8""))

Set xmlNode = xmlDoc.appendChild(xmlDoc.createElement("root"))
Set xmlAttr = xmlNode.Attributes.setNamedItem(xmlDoc.createAttribute("xmlns"))  *
xmlAttr.NodeValue = "http://www.・・・"   ←ここでエラーがでます
Set xmlNode = xmlDoc.appendChild(xmlDoc.createElement("child"))
Set xmlNode = xmlDoc.appendChild(xmlDoc.createTextNode("test"))

xmlString = xmlDoc.XML
Debug.Print xmlString

xmlDoc.Save("C:\・・・.xml")


属性が"xmlns"や"xmlns:xsi"以外(IDなど)だとエラーが起こらないのですが。

また、*の部分をsetAttributeを使って、
Set xmlNode = xmlNode.setAttribute("xmlns","http://www.・・・")
とすると"Functionまたは変数が必要です"というエラーがでます。

不適切な部分もあると思いますが、
わかる方がいらっしゃいましたらよろしくお願いいたします。


以下、出力させたい内容です。
<?xml version="1.0",encording="utf-8"?>
<root xmlns="http://www.・・・">
<child>test</child>
</root>

最後まで読んでいただきありがとうございました。
引用返信 編集キー/
■43457 / inTopicNo.2)  Re[1]: vbでxml出力
□投稿者/ やじゅ (1405回)-(2009/11/10(Tue) 23:14:37)
やじゅ さんの Web サイト
No43454 (まきお さん) に返信
> Set xmlNode = xmlDoc.appendChild(xmlDoc.createElement("root"))
> Set xmlAttr = xmlNode.Attributes.setNamedItem(xmlDoc.createAttribute("xmlns"))  *
> xmlAttr.NodeValue = "http://www.・・・"   ←ここでエラーがでます

「setNamedItem実行後にはそのNodeのNodeValueは変更できないみたいなので
変更してからsetNamedItemを実行することになりそう」 って検索で出ました。
http://questionbox.jp.msn.com/qa4226645.html
引用返信 編集キー/
■43459 / inTopicNo.3)  Re[1]: vbでxml出力
□投稿者/ 魔界の仮面弁士 (1381回)-(2009/11/10(Tue) 23:56:58)
No43454 (まきお さん) に返信
> コード

Instruction(命令) が Introduction(導入)になっていたり、
「version="1.0" encoding="utf-8"」が
「version="1.0",encording="utf-8"」になっていたり、
引用符が一致していなかったり、
MSXML2 が MAXML2 になっていたり、
xmlNode.appendChild とするべき場所で
xmlDoc.appendChild と書いていたり、
xmlString が宣言されていない(xmStr ならある)など、
他にもいろいろと間違っているようです。


> xmlAttr.NodeValue = "http://www.・・・"   ←ここでエラーがでます

名前空間を指定するなら、createNode メソッドの方が楽かと。

Set xmlNode = xmlDoc.appendChild(xmlDoc.createNode(NODE_ELEMENT, "root", "http://www.example.com/"))
Set xmlNode = xmlNode.appendChild(xmlDoc.createNode(NODE_ELEMENT, "child", "http://www.example.com/"))
xmlNode.Text = "test"

引用返信 編集キー/
■43513 / inTopicNo.4)  Re[2]: vbでxml出力
□投稿者/ まきお (2回)-(2009/11/11(Wed) 19:58:11)
No43457 (やじゅ さん) に返信
> http://questionbox.jp.msn.com/qa4226645.html

変更するということがうまくわからず断念したので
こちらの方に質問させていただきました。
ありがとうございます。

No43459 (魔界の仮面弁士 さん) に返信

コードが自宅にはないためミスばかりですみません。

> 名前空間を指定するなら、createNode メソッドの方が楽かと。

できました!ありがとうございます。

追加の質問になってしまうのですが

<root xmlns="http://www.・・・"
xmlns:xsi="http://www.・・・"
xsi:schemaLocation="http://www.・・・">

としたいのですが。現在のやり方ではできないのでしょうか。
最初から記載すればよかったのですが、よろしければお願いします。
引用返信 編集キー/
■43516 / inTopicNo.5)  Re[3]: vbでxml出力
□投稿者/ 魔界の仮面弁士 (1383回)-(2009/11/11(Wed) 20:46:06)
2009/11/11(Wed) 22:41:17 編集(投稿者)

No43513 (まきお さん) に返信
>>http://questionbox.jp.msn.com/qa4226645.html
> 変更するということがうまくわからず断念したので

元のコードは、名前空間を指定するために
 Set xmlAttr = xmlNode.Attributes.setNamedItem(xmlDoc.createAttribute("xmlns"))
 xmlAttr.nodeValue = "http://www.example.com/"
としてエラーとなっていますが、これは、属性ノードを要素ノードに追加してから、
その後で属性値を変更しようとしているためです。

この場合正しくは、
 Set xmlAttr = xmlDoc.createAttribute("xmlns")
 xmlAttr.nodeValue = "http://www.example.com/"
 xmlNode.Attributes.setNamedItem xmlAttr
のように、まず、属性ノードに属性値をセットし終わってから、
要素ノードに追加するようにします。


> <root xmlns="http://www.・・・"
> xmlns:xsi="http://www.・・・"
> xsi:schemaLocation="http://www.・・・">
> としたいのですが。

たとえば、以下のように記述すれば OK です。
  Set xmlNode = xmlDoc.appendChild(xmlDoc.createNode(NODE_ELEMENT, "root", "http://www.example.com/"))
  Set xmlAttr = xmlDoc.createNode(NODE_ATTRIBUTE, "xsi:schemaLocation", "http://www.example.net/")
  xmlNode.Attributes.setNamedItem(xmlAttr).nodeValue = "http://www.yahoo.com/"


やろうと思えば、上記を一行で書くこともできますが…流石にこれでは読みにくいですね。
  xmlDoc.appendChild(xmlDoc.createNode(NODE_ELEMENT, "root", "http://www.example.com/")).Attributes.setNamedItem(xmlDoc.createNode(NODE_ATTRIBUTE, "xsi:schemaLocation", "http://www.example.net/")).nodeValue = "http://www.yahoo.com/"


ところで、今回の質問は
>>> 分類:[.NET 全般]
として投稿されていましたが、実際には .NET に関する話題ではありませんよね。

Excel VBA に関する内容であれば、[Microsoft Office 全般] か [VB6 以前] あたりが
適当かと思います。次回投稿時には、分類の選択もお忘れなく。
引用返信 編集キー/
■43586 / inTopicNo.6)  Re[4]: vbでxml出力
□投稿者/ まきお (4回)-(2009/11/13(Fri) 00:01:38)
No43516 (魔界の仮面弁士 さん) に返信

> この場合正しくは、
>  Set xmlAttr = xmlDoc.createAttribute("xmlns")
>  xmlAttr.nodeValue = "http://www.example.com/"
>  xmlNode.Attributes.setNamedItem xmlAttr
> のように、まず、属性ノードに属性値をセットし終わってから、
> 要素ノードに追加するようにします。
>
> たとえば、以下のように記述すれば OK です。
>   Set xmlNode = xmlDoc.appendChild(xmlDoc.createNode(NODE_ELEMENT, "root", "http://www.example.com/"))
>   Set xmlAttr = xmlDoc.createNode(NODE_ATTRIBUTE, "xsi:schemaLocation", "http://www.example.net/")
>   xmlNode.Attributes.setNamedItem(xmlAttr).nodeValue = "http://www.yahoo.com/"
>

無事にxmlファイルを出力できました。
魔界の仮面弁士 さんには他の質問板でも説明を読ませていただき助けられました。
とても丁寧に説明していただき本当にありがとうございます。

ちなみに、メモ帳なのでファイルを開くと改行がない
(文字列としているから当たり前なんですが今頃気づきました)
んですが、改行があるものと比べるとxmlファイルとして問題あるのでしょうか?


> ところで、今回の質問は
> >>> 分類:[.NET 全般]
> として投稿されていましたが、実際には .NET に関する話題ではありませんよね。

はじめての投稿だったものですみません。
今後気をつけます。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -