- PR -

オブジェクトをXMLでシリアライズについて

1
投稿者投稿内容
ゆき
会議室デビュー日: 2008/12/24
投稿数: 2
投稿日時: 2008-12-24 17:55
タイトルの件に関して質問させて下さい。
使用言語は、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属性を出力しないようにしたい。
これに関してはあっても問題ないはずなんですが、
上流の工程でこれがあるとエラーになるみたいで出力しないで欲しいと言われています。
本来なら上流の工程を修正して欲しい所なんですが・・・。

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

宜しくお願い致します。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2008-12-24 18:18
あっても問題がないはず、ではなく、なければ問題になる、のはず。
たまたま、そこで定義している名前空間の要素を使っていないだけです。
rain
ぬし
会議室デビュー日: 2006/10/19
投稿数: 549
投稿日時: 2008-12-25 10:44
情報共有のため、リンクを置いておきます。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=47734&forum=7

-----
失礼、こっちでした。
http://bbs.wankuma.com/index.cgi?mode=al2&namber=30480

[ メッセージ編集済み 編集者: rain 編集日時 2008-12-25 11:52 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2008-12-25 11:20
引用:

rainさんの書き込み (2008-12-25 10:44) より:

情報共有のため、リンクを置いておきます。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=47734&forum=7


スタックが溢れてしまいました。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
MOTO
会議室デビュー日: 2008/12/25
投稿数: 1
投稿日時: 2008-12-25 13:10
こんにちは、ゆきさん。
こういう要望ってよくありますよねぇ…(; ̄ー ̄
独自のXMLパーサを使用している機器が相手だったりすると、
嫌でもこちらで対応するしかなかったりしますもんね(T△T)

まず1点目のご質問ですが、
XmlSerializerクラスは、Serializeメソッドに引数として指定した
ストリームのエンコーディング形式を用いてXMLファイルを出力します。
このため、上記ストリームのエンコーディング形式に任意の形式を指定
することにより、XML宣言のencoding属性値を変更することが可能です。

次に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を用いてスキーマから作成したオブジェクトにおいても、
おそらく上記方法の応用で実現できると思います。

なお当方、恥ずかしながら本投稿が初投稿となりますため、
不備などございましたらご指摘いただければ幸いです。
ゆき
会議室デビュー日: 2008/12/24
投稿数: 2
投稿日時: 2008-12-25 14:48
無事に解決しました。

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

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