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

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

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

Re[5]: オブジェクトをXMLでシリアライズについて


(過去ログ 54 を表示中)

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

■30480 / inTopicNo.1)  オブジェクトをXMLでシリアライズについて
  
□投稿者/ ゆき (1回)-(2008/12/24(Wed) 17:34:20)

分類:[C#] 

タイトルの件に関して質問させて下さい。
使用言語は、C#2005です。

内容は、xsd.exeによるスキーマの自動生成して、
スキーマからソースの自動生成を行いました。
 参考URL
 http://www.atmarkit.co.jp/fdotnet/easyxml/easyxml12/easyxml12_01.html

それを使用してXMLファイルを作成しています。
下記に質問に関連する部分を書きます。

<?xml version="1.0"?>
<format xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

質問は2点あります。

1つ目は、エンコードの指定を追加したい。
<?xml version="1.0"?> ⇒ <?xml version="1.0" encoding="euc-jp" ?>

2つ目は、formatタグのxmlns:xsi属性とxmlns:xsd属性を出力しないようにしたい。
これに関してはあっても問題ないはずなんですが、
上流の工程でこれがあるとエラーになるみたいで出力しないで欲しいと言われています。
本来なら上流の工程を修正して欲しい所なんですが・・・。

スキーマから作成したソースを扱えばいいのかなと思って調べたのですが、
どこをいじればいいのか分かりません。

宜しくお願い致します。
引用返信 編集キー/
■30482 / inTopicNo.2)  Re[1]: オブジェクトをXMLでシリアライズについて
□投稿者/ Chuki (7回)-(2008/12/24(Wed) 17:54:04)
2008/12/24(Wed) 17:58:22 編集(投稿者)

申し訳ありません。全く関係ありませんでしたm(_ _)m
----
お世話になっております。ちゅきと申します。

Encodingだけなら、下記質問にコードを付けてますのでご参考に。

「xsi:schemaLocationに関して」
http://bbs.wankuma.com/index.cgi?mode=al2&namber=29859

No30480 (ゆき さん) に返信
> タイトルの件に関して質問させて下さい。
> 使用言語は、C#2005です。
>
> 内容は、xsd.exeによるスキーマの自動生成して、
> スキーマからソースの自動生成を行いました。
>  参考URL
>  http://www.atmarkit.co.jp/fdotnet/easyxml/easyxml12/easyxml12_01.html
>
> それを使用してXMLファイルを作成しています。
> 下記に質問に関連する部分を書きます。
>
> <?xml version="1.0"?>
> <format xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
>
> 質問は2点あります。
>
> 1つ目は、エンコードの指定を追加したい。
> <?xml version="1.0"?> ⇒ <?xml version="1.0" encoding="euc-jp" ?>
>
> 2つ目は、formatタグのxmlns:xsi属性とxmlns:xsd属性を出力しないようにしたい。
> これに関してはあっても問題ないはずなんですが、
> 上流の工程でこれがあるとエラーになるみたいで出力しないで欲しいと言われています。
> 本来なら上流の工程を修正して欲しい所なんですが・・・。
>
> スキーマから作成したソースを扱えばいいのかなと思って調べたのですが、
> どこをいじればいいのか分かりません。
>
> 宜しくお願い致します。
引用返信 編集キー/
■30484 / inTopicNo.3)  Re[1]: オブジェクトをXMLでシリアライズについて
□投稿者/ Hongliang (325回)-(2008/12/24(Wed) 18:29:55)
> 1つ目は、エンコードの指定を追加したい。
> <?xml version="1.0"?> ⇒ <?xml version="1.0" encoding="euc-jp" ?>

XmlWriterSettings で Encoding を指定し、その XmlWriterSettings を使って XmlWriter.Create で XmlWriter を作成します。
シリアライズ先にこの XmlWriter を指定すれば自動的にエンコーディングを行ってくれます。

> 2つ目は、formatタグのxmlns:xsi属性とxmlns:xsd属性を出力しないようにしたい。

属性とかで制御できるかなと思ったけどどうも見当たりませんね。
いささか強引で結果オーライな感じですが、XmlSerializerNamespaces を作成し、何か一つ適当なプリフィクス・名前空間 URI の組み合わせを Add してそれを XmlSerializer を new するときに引数として渡してやれば消えるみたいです。
引用返信 編集キー/
■30490 / inTopicNo.4)  Re[2]: オブジェクトをXMLでシリアライズについて
□投稿者/ aetos (58回)-(2008/12/24(Wed) 20:20:12)
No30482 (Chuki さん) に返信
> 2008/12/24(Wed) 17:58:22 編集(投稿者)
>
> 申し訳ありません。全く関係ありませんでしたm(_ _)m
> ----
> お世話になっております。ちゅきと申します。
>
> Encodingだけなら、下記質問にコードを付けてますのでご参考に。
>
> 「xsi:schemaLocationに関して」
> http://bbs.wankuma.com/index.cgi?mode=al2&namber=29859

このスレの時に試してみましたが、どうも全ての Encoding が使えるわけではないようで。
StringBuilder に出力したら、Encoding に何を指定しても UTF-16 になっちゃいました。
Console.Out に出力したら、全部 shift_jis に。
Stream と StreamWriter に出力した場合は、指定した通りの Encoding になるようです。
StreamWriter も Console.Out も同じ TextWriter だろうに、どうして結果が異なるのかは謎ですが。
引用返信 編集キー/
■30491 / inTopicNo.5)  Re[3]: オブジェクトをXMLでシリアライズについて
□投稿者/ aetos (59回)-(2008/12/24(Wed) 20:35:19)
No30490 (aetos さん) に返信
> StreamWriter も Console.Out も同じ TextWriter だろうに、どうして結果が異なるのかは謎ですが。

Console.Out.Encoding.EncodingFallback が何かやってるのかもしれませんね。
引用返信 編集キー/
■30492 / inTopicNo.6)  Re[3]: オブジェクトをXMLでシリアライズについて
□投稿者/ aetos (60回)-(2008/12/24(Wed) 20:46:26)
No30490 (aetos さん) に返信
> StreamWriter も Console.Out も同じ TextWriter だろうに、どうして結果が異なるのかは謎ですが。

恥ずかしい。見なかったことにしてください。
StreamWriter と XmlWriterSettings に同じ Encoding を指定してりゃ、任意の Encoding になるのも当然でした。
違う Encoding を指定すると、StreamWriter の方が優先されました。
引用返信 編集キー/
■30502 / inTopicNo.7)  Re[2]: オブジェクトをXMLでシリアライズについて
□投稿者/ みきぬ (323回)-(2008/12/25(Thu) 10:44:02)
情報共有リンク
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=47734&forum=7
引用返信 編集キー/
■30504 / inTopicNo.8)  Re[3]: オブジェクトをXMLでシリアライズについて
□投稿者/ MOTO (1回)-(2008/12/25(Thu) 13:18:21)
MOTO さんの Web サイト
2008/12/25(Thu) 13:25:31 編集(投稿者)
はじめましてm(_ _)m
恥ずかしながら本投稿が初投稿となりますため、
不備などございましたらご指摘いただければ幸いです。

2点目のご質問に関してですが、
ゆきさんの仰るとおり"xmlns:xsi"並びに"xmlns:xsd"の名前空間宣言は
省略することが可能です(削除してもIEで正常に表示できますし)。
またXMLSerializerクラスは、Serializeメソッドに引数として明示的に
名前空間宣言(XmlSerializerNamespacesクラス)を指定した場合、
前述の名前空間宣言を使用せずに指定した名前空間宣言を使用して
XMLファイルを出力します。このため、接頭辞と名前空間が空の宣言を
指定することにより、結果として"xmlns:xsi"並びに"xmlns:xsd"の
名前空間宣言を出力しないようにすることが可能です。

文章ではいまひとつわかりにくいと思いますので、
下記にサンプルコードを記載させていただきます。
----------------------------------------------------------------------
using System;
using System.IO;
using System.Text;
using System.Xml.Serialization;
namespace Default
{
    /// <summary>シリアライズの対象となるクラス</summary>
    public class Person
    {
        private string _name;

        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }
    }
    /// <summary>エントリーポイント</summary>
    public class Program
    {
        static void Main(string[] args)
        {
            //シリアライズするオブジェクトを生成
            Person person = new Person();
            person.Name = "MOTO";

            //シリアライズに使用するストリームを生成
            //※このストリームのエンコーディング形式がXML宣言のencoding属性値となる
            using (StreamWriter writer = new StreamWriter("Person.xml", false, Encoding.GetEncoding("euc-jp")))
            {
                //空の名前空間宣言を生成
                XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
                ns.Add("", "");

                //オブジェクトをXMLファイルにシリアライズ
                //※空の名前空間宣言を既定の空間空間として指定する
                XmlSerializer serializer = new XmlSerializer(typeof(Person));
                serializer.Serialize(writer, person, ns);
            }
        }
    }
}
----------------------------------------------------------------------
xsd.exeを用いてスキーマから作成したオブジェクトにおいても、
おそらく上記方法の応用で実現できると思います。

ps:Hongliangさんがすでに解決方法を記載されていたのですね…(; ̄ー ̄
   確認せずに重複投稿してしまい申し訳ございませんでしたm(;_ _)m

引用返信 編集キー/
■30515 / inTopicNo.9)  Re[4]: オブジェクトをXMLでシリアライズについて
□投稿者/ ゆき (2回)-(2008/12/25(Thu) 14:46:00)
無事に解決しました。

やり方は、MOTOさんのソースを参考とさせて貰いました。
書き込みして下さったみなさん有難う御座いました。

解決済み
引用返信 編集キー/
■30536 / inTopicNo.10)  Re[5]: オブジェクトをXMLでシリアライズについて
□投稿者/ Jitta on the way (255回)-(2008/12/25(Thu) 21:29:31)
No30515 (ゆき さん) に返信
> 無事に解決しました。
>
> やり方は、MOTOさんのソースを参考とさせて貰いました。
> 書き込みして下さったみなさん有難う御座いました。
>

んー?
「名前空間が設定できない」仕様でいいの?名前空間の別名を指定することは出来ないけど、要素に直接書くことは出来るの?
今は動くけど、将来的に動かなくなる可能性について、考慮する必要はないの?
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -