Webサイトのxmlファイル更新方法

このQ&Aのポイント
  • Webサイトにあるxmlファイルを更新する方法を教えてください。
  • 開発環境はVisual Studio .NET 2003と.NET Framework 1.1で、言語はC#です。
  • 自作クラスに保持した情報をシリアライズ・デシリアライズしxmlファイルで保存しようとしていますが、Webサイトでのテストでエラーが発生しています。エラー内容は「ストリームに書き込めませんでした」です。
回答を見る
  • ベストアンサー

Web サイトにあるxmlファイルを更新する方法を教えてください。

開発環境: Visual Studio .NET 2003 .NET Framework 1.1 言語: C# Web サイトにあるxmlファイルを更新する方法を教えてください。 自作クラスに保持した情報をシリアライズ・デシリアライズしxmlファイルで保存しようとしています。 シリアライズでxmlファイルを更新するのが上手くいきません。 ローカルPCでテストした結果は上手く動作しますが、Web サイトでテストするとエラーが出ます。 エラー内容は、 System.ArgumentException : ストリームに書き込めませんでした。 ===ソースコード始=== //URLを取得する Uri myUri = new Uri ("http://www.**********/test.xml");//URLを指定 XmlUrlResolver resolver = new XmlUrlResolver(); //XmlSerializerオブジェクトを作成 //書き込むオブジェクトの型を指定する System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer( typeof(MyData));//MyDataはオブジェクトの型 //ファイルを開く System.IO.Stream fs = (System.IO.Stream)resolver.GetEntity(myUri, null, typeof(System.IO.Stream)); //シリアル化し、XMLファイルに保存する serializer.Serialize(fs, d_MyData);//d_MyDataはオブジェクト *ココでエラーが出ます。 ===ソースコード終=== Web サイトでのフォルダ権限はフルコントロールに設定しています。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

himajin100000の日記 まず,当方環境は.NET 3.5(.NET 2.0ベース)とVB.NET Orcas Beta1を用いていることを述べておく。 回答するにあたり、サンプルソースを内容を変化させずにVB.NETに移植して動作させてみたが, ローカル環境においても動作しなかった。 原因はいくつかあって、 まず最初に気づいたのは Dim fs As System.IO.Stream = TryCast(resolver.GetEntity(myUri, null, Type.GetType("System.IO.Stream")),System.IO.Stream) によってfsに格納されたSystem.IO.StreamのCanWriteプロパティ[ReadOnly]がFalseだったこと。 dobon.netの内容を参考にSystem.IO.FileStreamのコンストラクタの第二引数にSystem.IO.FileMode.Create を与えることで,書き込みができるオブジェクトが得られるだろうと考えた。 http://dobon.net/vb/dotnet/file/xmlserializer.html そこでSystem.IO.IOStreamオブジェクトとSystem.IO.FileMode.Createを引数に与えて System.IO.FileStreamを得る方法に自信がなかったし,必要性もよくわからなかったのでresolver.GetEntityを経由せず、 system.uriを直接指定する形をとり Namespace hoge Module Module1 Sub Main() 'Dim myUri As System.Uri = New System.Uri("C:\Data\Administrator\Oshiete_Goo\(略)\Q3200230A\SerializedObject.xml") 'Dim resolver As System.Xml.XmlUrlResolver = New System.Xml.XmlUrlResolver() Dim d_MyData As New Mydata Dim serializer As System.Xml.Serialization.XmlSerializer = New System.Xml.Serialization.XmlSerializer(Type.GetType("ConsoleApplication1.hoge.Mydata")) Dim fs As System.IO.FileStream = New System.IO.FileStream(myUri.AbsoluteUri, System.IO.FileMode.Create) serializer.Serialize(fs, d_MyData) End Sub End Module Public Class Mydata Public hoge As Integer Sub New() hoge = 3 End Sub End Class End Namespace としたが、やっぱり動作しなかった。 少し考えて 'Dim myUri As System.Uri = New System.Uri("C:\Data\Administrator\Oshiete_Goo\(略)\Q3200230A\SerializedObject.xml") とコメントアウトし Dim fs As System.IO.FileStream = New System.IO.FileStream("C:\Data\Administrator\Oshiete_Goo\(略)\Q3200230A\SerializedObject.xml", System.IO.FileMode.Create) とファイル名を直に与えたところ動作したため,実行時のmyUri.Absoluteuriを見たら file:///で始まっていて、出たエラーが「URI フォーマットはサポートされていません。」だった。 ここでピンと来たのだが, 【http://で始まるURIを指定しているということは当たり前ながら使っているプロトコルはHTTPである。 HTTPでファイルを作成したりするにはPUTメソッド等を用いるはずで, serializer.Serialize(fs, d_MyData)の処理中にあるであろう 書き込み処理の仕方はローカルでファイルを書き込む方法とは異なるはずだ。 これらのクラスはそこまで考えられているだろうか?】 もしコレが原因なら,場合によってはFTPを使う方法やHTTPでPUTメソッドを使う方法で回避することになる。 リモートマシンへの書き込み方法を調べていると, UNCという言葉に行き当たった。 http://www.atmarkit.co.jp/icd/root/91/5787091.html もともと,以前うちでは家族に言われて俺が実験的にNetBIOSの設定等をする羽目になり, その勉強として色々学んだからなんとなく勝手はわかる。 コンピュータ名はHIMAJINだ。 ローカルマシン上にgyaフォルダを作成し このフォルダにgyaという共有名をつけて共有。 フルコントロール権をAdministrator,Administrators,CreateOwner,EveryOneに与え, Namespace hoge Module Module1 Sub Main() 'Dim myUri As System.Uri = New System.Uri("C:\Data\Administrator\Oshiete_Goo\(略)\Q3200230A\SerializedObject.xml") 'Dim resolver As System.Xml.XmlUrlResolver = New System.Xml.XmlUrlResolver() Dim d_MyData As New Mydata Dim serializer As System.Xml.Serialization.XmlSerializer = New System.Xml.Serialization.XmlSerializer(Type.GetType("ConsoleApplication1.hoge.Mydata")) Dim fs As System.IO.FileStream = New System.IO.FileStream("\\HIMAJIN\gya\test.xml", System.IO.FileMode.Create) 'Dim fs As System.IO.FileStream = New System.IO.FileStream("C:\Data\Administrator\Oshiete_Goo\Quarter2\Q3200230\Q3200230A\Q3200230A\SerializedObject.xml", System.IO.FileMode.Create) serializer.Serialize(fs, d_MyData) End Sub End Module Public Class Mydata Public hoge As Integer Sub New() hoge = 3 End Sub End Class End Namespace どきどきしながら実行してみるとファイルが作成された。 やはりそれがスキームが原因だったのだろう。

naoki263
質問者

お礼

himajin100000様 回答ありがとうございます。 http経由で書き込み処理する時に、System.IO.FileStreamがサポートされてないのが原因のようですね。 Webサービス経由でオブジェクトを渡して、そこからWebサーバー内にSystem.IO.FileStreamで書き込む方法で試してみたいと思います。 ありがとうございました。

関連するQ&A

  • [VB.NET]クラスのシリアライズでエラーが発生

    プログラムを作っていて設定を保存するためのクラスを作ったのですが原因不明のエラーが出てきてしまいます。 Public Class cde_config Const CONFIG_FILE As String = "config.xml" Public FolderName As String Public exex As New ArrayList Public Sub New() If File.Exists(CONFIG_FILE) Then Dim serializer As XmlSerializer = New XmlSerializer(GetType(cde_config)) Dim stream As FileStream = New FileStream(CONFIG_FILE, FileMode.Open) Try Me.FolderName = CType(serializer.Deserialize(stream), cde_config).FolderName 'ここでエラーが発生 Me.exex = CType(serializer.Deserialize(stream), cde_config).exex Finally stream.Close() End Try Else FolderName = "略" exex.Add(New String("略")) End If End Sub Public Sub save() Dim serializer As XmlSerializer = New XmlSerializer(GetType(cde_config)) Dim stream As FileStream = New FileStream(CONFIG_FILE, FileMode.Create) Try serializer.Serialize(stream, Me) Finally stream.Close() End Try End Sub End Class エラーの内容は 'System.InvalidOperationException' のハンドルされていない例外が system.xml.dll で発生しました。 追加情報 : XML ドキュメント (2,2) でエラーが発生しました。 です。 どこに問題があるのでしょうか。

  • XML ドキュメントでエラーが発生 対処方法は?

    言語C# ネットで付箋紙の作り方を紹介していたので、コピペして作っているのですが、以下のエラーがでます。 (参考にしているサイトttp://pineplanter.moo.jp/non-it-salaryman/2017/07/07/sticky3-by-csharp/) 以下情報だけで分かるのかもわからないのですが、対処方法をご存じの方、お教えください。 ■エラーが出る位置 private void getData() { FileStream file = new FileStream("sticky.xml", FileMode.Open); XmlSerializer serializer = new XmlSerializer(typeof(StickyList)); list = (StickyList)serializer.Deserialize(file); ←ここでエラー file.Close(); } ■エラー内容 System.InvalidOperationException XML ドキュメント (4,11) でエラーが発生しました。 内部例外 指定されたエンコードに無効な文字があります。 行 4、位置 11。 ■"sticky.xml"の内容 <?xml version="1.0" encoding="utf-8"?> <Stickys xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <Sticky> <text>テスト付箋紙</text> <width>300</width> <height>150</height> <top>200</top> <left>200</left> <red>255</red> <green>200</green> <blue>200</blue> <font-family>Meiryo UI</font-family> <font-size>14</font-size> </Sticky> </Stickys>

  • 弥生ドライブが起動しません

    弥生販売15プロフェッショナルを使用しています。 ある日突然、弥生ドライブが起動しなくなりました。 いろいろと調べてみたところ以下のログが出てきました。 - ファイルのシリアライズ/デシリアライズ処理中にエラーが発生しました。 System.InvalidOperationException: XML ドキュメント (0,0) でエラーが発生しました。 ---> System.Xml.XmlException: ルート要素が見つかりません。 場所 System.Xml.XmlTextReaderImpl.Throw(Exception e) 場所 System.Xml.XmlTextReaderImpl.ThrowWithoutLineInfo(String res) 場所 System.Xml.XmlTextReaderImpl.ParseDocumentContent() 場所 System.Xml.XmlTextReaderImpl.Read() 場所 System.Xml.XmlTextReader.Read() 場所 System.Xml.XmlReader.MoveToContent() 場所 Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderYDUserFile.Read6_LoginUser() --- 内部例外スタック トレースの終わり --- 場所 System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events) 場所 System.Xml.Serialization.XmlSerializer.Deserialize(Stream stream) 場所 Yayoi.Drive.Client.Common.SerializeUtility.Deserialize[T](String path) 2015/03/31 10:09:17 [FATAL] (1_70) - 弥生ドライブの起動中にエラーが発生しました。 System.NullReferenceException: オブジェクト参照がオブジェクト インスタンスに設定されていません。 場所 Yayoi.Drive.Client.Presentation.Command.StartProcess.CheckMypageIdCustId() 場所 Yayoi.Drive.Client.Presentation.Command.StartProcess.IsUserGuideShow() 場所 Yayoi.Drive.Client.Presentation.Command.StartProcess.Execute(Object parameter) 場所 Yayoi.Drive.Client.Application.App.Application_Startup(Object sender, StartupEventArgs e) 午前中は問題ありませんでしたが、午後に異常となりました。 その間、PCのアップデートなどは行ってません。 何が原因か全く解らず困っています。

  • 一時ファイルをsavefileDialogを利用して保存するにはどのようにしたら良いのでしょうか?

    環境:VS2005 C# プログラム上でコメントアウトしてある様なやり方ではなく、 一旦、一時ファイルを作成しそのファイルをダイアログで保存先を任意のフォルダに保存したいのですがやり方はあるのでしょうか? OpenFileDialog ofd = new OpenFileDialog(); //一時ファイルを作成する string file_name = Path.GetTempFileName(); System.IO.StreamWriter writer = new StreamWriter(file_name); writer.WriteLine("tmptest"); writer.Close(); //ダイアログを表示 ofd.ShowDialog(); /*******************************▼コメントアウト System.IO.Stream stream; stream = ofdfilecommit.OpenFile(); if (stream != null) { //ファイルに書き込む System.IO.StreamWriter sw = new System.IO.StreamWriter(stream, 文字コード); sw.WriteLine("test"); //閉じる sw.Close(); stream.Close() } ********************************▲コメントアウト*/ //オブジェクトの破棄 ofd.Dispose(); ご協力お願いします。

  • VB ファイル保存

    XMLファイルに設定情報を保存仕様としているのですが,ある所でエラーが出てうまく走りません. 下記がそのプログラムになりますが,XMLファイルに保存のコメント下の所でエラーになります. エラーの内容は「保護レベルの設定が原因で'windowsApplication1.Form2'にアクセスできません」 です. どなたかご教示のほどよろしくお願いいたします. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click 'ファイルが存在しない場合に新規にブランクファイルを作成する 'XMLファイルパス Dim xmlFile1 As String = "C:\OBS_Setting.xml" Dim hStream As System.IO.FileStream 'XMLファイルが存在するか確認 If Dir(xmlFile1) = "" Then ' 指定したパスのファイルを作成する hStream = System.IO.File.Create(xmlFile1) ' hStream が破棄されることを保証するために Try ~ Finally を使用する Try ' hStream が閉じられることを保証するために Try ~ Finally を使用する Try Finally ' 作成時に返される FileStream を利用して閉じる If Not hStream Is Nothing Then hStream.Close() End If End Try Finally ' hStream を破棄する If Not hStream Is Nothing Then Dim cDisposable As System.IDisposable = hStream cDisposable.Dispose() End If End Try End If 'XMLファイルに設定データを保存する Dim Area As String = ComboBox1.Text Dim State As String = ComboBox2.Text Dim City As String = ComboBox3.Text Dim BefY As String = ComboBox4.SelectedIndex Dim AftY As String = ComboBox5.SelectedIndex Dim BefM As String = ComboBox6.SelectedIndex Dim AftM As String = ComboBox7.SelectedIndex '保存するオブジェクトの配列を作成 '保存するオブジェクトの配列を作成 Dim myClasses(6) As SampleClass myClasses(0) = New SampleClass() myClasses(0).Number = 0 myClasses(0).Message = Area myClasses(1) = New SampleClass() myClasses(1).Number = 1 myClasses(1).Message = State myClasses(2) = New SampleClass() myClasses(2).Number = 2 myClasses(2).Message = City myClasses(3) = New SampleClass() myClasses(3).Number = 3 myClasses(3).Message = BefY myClasses(4) = New SampleClass() myClasses(4).Number = 4 myClasses(4).Message = AftY myClasses(5) = New SampleClass() myClasses(5).Number = 5 myClasses(5).Message = BefM myClasses(6) = New SampleClass() myClasses(6).Number = 6 myClasses(6).Message = AftM 'XMLファイルに保存 Dim serializer As New System.Xml.Serialization.XmlSerializer(GetType(SampleClass())) Dim fs1 As New IO.FileStream(xmlFile1, IO.FileMode.Create) serializer.Serialize(fs1, myClasses) fs1.Close() End Sub 'XMLファイルに保存するオブジェクトのためのクラス Public Class SampleClass Public Number As Integer Public Message As String End Class

  • java XMLファイル 操作

    現在javaにてXMLファイルにデータベースの接続情報を保存する処理を 作成しています。XMLファイルの読み書きは問題なく動作するのですが、テストの為にXMLファイルを更新(データベースの接続情報は誤りの状態)にしました。その後データベースに接続して行う処理を行う際にはエラーとなる事を期待しているのですが、正常に処理されてしまいます。XMLファイルを更新した時点でテキストエディタ等で確認すると確かに更新されています。 なぜデータベースに接続して行う処理が正常に流れるのか疑問です。 ただし、いったんシステムの実行を終了して、再度実行すると、期待通りエラーとなります。 何か分かる方がいらっしゃればと思い質問いたしました。 <XML読込> public Object readXML(){ Object objBean = null; try{ // XMLからオブジェクトへの変換オブジェクトを生成する。 XMLDecoder xmlDecoder = new XMLDecoder( new BufferedInputStream( new FileInputStream(this._strFile))); // 指定したXMLファイルからオブジェクトにデータを読み込む objBean = xmlDecoder.readObject(); // 変換オブジェクトを閉じる xmlDecoder.close(); }catch(FileNotFoundException e){ // 指定されたパス名で示されるファイルが開けなかった場合の例外 bs.Setlog("readXML","FileNotFoundException",e.getMessage()); } <XML書込> public Boolean writeXML(Object objBean){ try{ // オブジェクトからXMLへの変換オブジェクトを生成する XMLEncoder xmlEncoder = new XMLEncoder( new BufferedOutputStream( new FileOutputStream(this._strFile))); // 指定したXMLファイルにオブジェクトデータを書き込む xmlEncoder.writeObject(objBean); // 変換オブジェクトを閉じる xmlEncoder.close(); // XMLファイル書込成功 return true; }catch(FileNotFoundException e) { // 指定されたパス名で示されるファイルが開けなかった場合の例外 bs.Setlog("writeXML","FileNotFoundException",e.getMessage()); return false; // 書込失敗 } }

    • ベストアンサー
    • Java
  • VB2008 オブジェクトプロパティの保存方法

    VBの超初心者です。 早速質問ですが フォーム上に複数のチェックボックスやテキストがあり、そのプロパティ(checkedやtext)を保存し、 またその保存したファイルをフォーム上で開けることができるようにしたいのですが、 何をどうしたらいいのかわかりません。 方法としては↓に書かれているような方法であっているのでしょうか? http://dobon.net/vb/dotnet/file/xmlserializer.html ↑に書かれているMainClass.Main()を動かせば"C:\test\sample.xml"ができるのか? と、やってみたのですがDim serializer・・・のところでエラー ”System.InvalidOperationException はハンドルされませんでした。” となってしまいます。 そもそもの方法があっているのかどうかもわからず困惑中です。 どなたか、わかる方がいれば、参考ページでも結構ですので教えてください。 宜しく御願いします。

  • JavaScript側でのXML作成の方法

    JavaScript側でのXML作成の方法 Ajax開発の経験は始めてなので勝手がわかっていないのですが やりたい事はサーバー側からXMLデータを取得して JavaScript側でXMLを編集してサーバーに書き戻すような事がしたいのです。 このような場合、DOMツリーをXMLファイルにシリアライズするには IEだとActiveXObject("Microsoft.XMLDOM")、FireFoxだとXMLSerializer()を使うと いったようにブラウザごとに処理を分けねばなりません。 これは面倒なのであまりやりたくありません。 あとはベタなテキストとして var xml = "<?xml version='1.0' encoding='utf-8'?>" + "<root><element>test</element></root>" と書いていくくらいしか思いつかないのですが ブラウザ間ごとの違いを吸収してくれる XML編集用の便利なJavaScriptライブラリなどは存在したりするものでしょうか? (jQueryなどがそうのような機能を内包してたりする?) 少し調べてみた限りでは無さそうに感じたのですが 処理としてはよくありそうな事なのでお聞きしてみました。

  • XML DOM XMLパーサーについて理解していません

    XMLについてイマイチ理解していないので教えてください。PHPでXMLファイルを開いて何らかの処理をするとします。例えば <?php //ドキュメントオブジェクトの作成 $doc = new DOMDocument(); //XML 文書ファイルのパース(DOM ツリーの作成) $doc->load("docs/td101.xml") //要素"b"を取得する $bElement = $doc->getElementsByTagName("b")->item(0); //取得した要素"b"に属性"ad"を設定する $bElement->setAttribute("ad","Fukuoka"); //ドキュメントをシリアライズする $doc->save("docs/result101.xml"); ?> のようにXMLファイルに属性を追加するという処理を行うとします。この時、DOMはPHPによって生成されるんでしょうか?またXMLはXMLパーサーによって解析されると本で読んだのですが、この場合PHPがXMLパーサーの機能を持っているんでしょうか?それともブラウザにXMLパーサーの機能があり、ブラウザ側で処理をされているのでしょうか?意味がわからなくて申し訳ないですが、この辺りを理解していなくて・・・御願いいたします。

    • ベストアンサー
    • XML
  • XML出力時の日本語一部文字化け

    カテ違いでしたらすみません。 Serializerを使用し、XML出力を行い、別画面でそのXMLを読み込むという処理を行っています。 出力内容のXML文字コードはUTF-8ですが、一部漢字が文字化けしています。 UTF-8の問題なのかもしれませんが、何か解決方法やサイトがあれば教えてください。 ちなみに、化ける文字は「年齢」です。該当項目を消した時は動作します。 ・XML出力側 配列にセットの時のエンコード $val = mb_convert_encoding($val, "UTF-8", "auto"); ↓ require_once "XML/Serializer.php"; ini_set("mbstring.intern?al_encoding","UTF-8"); $options = array( "mode" => "simplexml" , "indent" => " ", "linebreak" => "\n", "typeHints" => false, "addDecl" => true, "encoding" => "UTF-8", "rootName" => "root", "defaultTagName" => "item", "attributesArray" => "_attributes" ); $Serializer = &new XML_Serializer($options); $status = $Serializer->serialize($xmldate); $somecontent = $Serializer->getSerializedData(); ・・・ ・XML読込側 require_once "XML/Unserializer.php"; $lines = file($path); $line = implode("", $lines); $line = mb_convert_encoding($line, $encoding, "UTF-8"); $unserializer =& new XML_Unserializer();// 解析に属性も含める$unserializer->setOption("parseAttributes", TRUE); $success = $unserializer->unserialize($line); if(is_object($success)) die( $success->getMessage() ); $xmldate = $unserializer->getUnserializedData(); phpのバージョンは4.3.11です。よろしくお願いします。

    • ベストアンサー
    • PHP

専門家に質問してみよう