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

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

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

Re[4]: シリアラズ 空要素タグ禁止


(過去ログ 112 を表示中)

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

■66260 / inTopicNo.1)  シリアラズ 空要素タグ禁止
  
□投稿者/ fullhappy (4回)-(2013/04/11(Thu) 15:49:27)

分類:[.NET 全般] 

c#4.0です。

シリアライズして、xmlを出力しているのですが
空文字列(string.Empty)や空リスト(List<>.Countが零)の場合、
空要素タグになってしまいます。

空要素タグを禁止する方法(属性など)が
ありましたら教えてください。


    [XmlElement("test")]
    public string テスト {get; set;}

    <test/> が出力されるが
    <test></test> を出力してほしい

理由は読込側のプログラムの要請です。

よろしくお願いします。

引用返信 編集キー/
■66263 / inTopicNo.2)  Re[1]: シリアラズ 空要素タグ禁止
□投稿者/ ニチェ (6回)-(2013/04/11(Thu) 19:24:33)
王道ではないかもしれませんが、XMLの内容をテキスト編集できるのであれば、
例えば、以下のように正規表現でXMLのテキストの置換を行うというのはどうでしょうか。

string xml = System.Text.RegularExpressions.Regex.Replace(元のxmlのテキスト, @"<([^>\s]+)(\s[^>]*)?/>", @"<$1$2></$1>");

もし、対象となるXMLのタグに属性(<test id=""/>のidようなもの)が含まれないものばかりであれば、もっと簡単なパターンでもいいでしょう。
引用返信 編集キー/
■66265 / inTopicNo.3)  Re[2]: シリアラズ 空要素タグ禁止
□投稿者/ fullhappy (6回)-(2013/04/11(Thu) 19:48:39)
ニチェさん、ありがとうございます。

申し訳ございません。
今回、前提としてWebServiceで
自動でシリアライズされるので
XMLの結果を変更するのは難しいと思います。

    public class MainWebService : System.Web.Services.WebService
    {
        [WebMethod]
	public 自作クラス Web処理()
        {
            自作クラス 応答;

            応答.xxxx = 1;
            応答.yyyy = "A";

            return 応答;   //戻ってからシリアライズ
        }
    }

引用返信 編集キー/
■66268 / inTopicNo.4)  Re[1]: シリアラズ 空要素タグ禁止
□投稿者/ Jitta (38回)-(2013/04/11(Thu) 23:38:17)
Jitta さんの Web サイト
No66260 (fullhappy さん) に返信
XmlWriter に書き出す処理を自分で書けばできたはず。
引用返信 編集キー/
■66274 / inTopicNo.5)  Re[2]: シリアラズ 空要素タグ禁止
□投稿者/ pang2 (19回)-(2013/04/12(Fri) 12:07:43)
> <test/> が出力されるが
> <test></test> を出力してほしい

testタグ自体を出力しないことでよいなら、


[XmlElement(IsNullable = false)]
public string test
{
get
{
return string.IsNullOrEmpty(テスト) ? null : テスト;
}
set
{
テスト = value;
}
}

[XmlIgnore()]
public string テスト { get; set; }
引用返信 編集キー/
■66295 / inTopicNo.6)  Re[2]: シリアラズ 空要素タグ禁止
□投稿者/ fullhappy (7回)-(2013/04/13(Sat) 13:45:40)
No66268 (Jitta さん) に返信
> ■No66260 (fullhappy さん) に返信
> XmlWriter に書き出す処理を自分で書けばできたはず。

Jitta さん、ありがとうございます。

XmlElementを使用し、楽にxmlを作成しようとしているので
頑張ると本末転倒になってしまうので、
属性やプロパティのような簡単にできるもので
お願いします。
引用返信 編集キー/
■66296 / inTopicNo.7)  Re[3]: シリアラズ 空要素タグ禁止
□投稿者/ fullhappy (8回)-(2013/04/13(Sat) 13:48:30)
No66274 (pang2 さん) に返信
>> <test/> が出力されるが
>> <test></test> を出力してほしい
>
> testタグ自体を出力しないことでよいなら、
>
>
> [XmlElement(IsNullable = false)]
> public string test
> {
> get
> {
> return string.IsNullOrEmpty(テスト) ? null : テスト;
> }
> set
> {
> テスト = value;
> }
> }
>
> [XmlIgnore()]
> public string テスト { get; set; }

pang2 さん、ありがとうございます。

こんな書き方もできるんですね。
xmlを受け取る方がタグ必須としていますので
残念ながら採用できません。

引用返信 編集キー/
■66297 / inTopicNo.8)  Re[3]: シリアラズ 空要素タグ禁止
□投稿者/ 守山 (1回)-(2013/04/13(Sat) 13:52:55)
<test/>がxml的に正しい構文のため、プロパティでどうこうできるものではないと思います。
どうして読込側は<test/>の形式に対応していないのでしょうか?
引用返信 編集キー/
■66302 / inTopicNo.9)  Re[4]: シリアライズ 空要素タグ禁止
□投稿者/ 魔界の仮面弁士 (195回)-(2013/04/13(Sat) 16:49:17)
# タイトル編集「シリアラズ」(知り非ず?)→「シリアライズ」

■No66265 (fullhappy さん) に返信
> 今回、前提としてWebServiceで
> 自動でシリアライズされるので
> XMLの結果を変更するのは難しいと思います。

Webサービスというと、*.asmx を使う方法と、*.svc を使う方法がありますね。

私自身は未だに前者しか使用したことが無く、WCF については勉強不足なのですが、
少なくとも *.asmx の方については、SOAPExtension クラスと
SOAPExtensionAttribute 属性を使う事で、シリアライズの前後で
処理を割り込みさせることができるようになっています。
http://msdn.microsoft.com/ja-jp/library/esw638yk.aspxNo66297 (守山 さん) に返信
> <test/>がxml的に正しい構文のため、プロパティでどうこうできるものではないと思います。
同感です。手軽に変換できるような属性やプロパティは用意されていないと思います――多分。

読み込み側に渡す前に、シリアライズ結果を加工するための処理を入れるか、
シリアライザを自作するかといった話になってしまうのでは無いでしょうか。

たとえば XSLT 使って、空要素を <xsl:text disable-output-escaping="yes"> に
かけていき、開始タグ+属性と終了タグを出力させるとか。


> どうして読込側は<test/>の形式に対応していないのでしょうか?
解釈側の要件としては、よくある話かと思いますよ。
たとえば XHTML の世界では、下記のような出力が求められますし。

 ○ <script src="sample.js"></script>
 × <script src="sample.js"/>
 × <script src="sample.js" />

 × <hr></hr>
 △ <hr/>
 ○ <hr />

引用返信 編集キー/
■66304 / inTopicNo.10)  Re[4]: シリアラズ 空要素タグ禁止
□投稿者/ fullhappy (9回)-(2013/04/13(Sat) 23:13:39)
No66297 (守山 さん) に返信
> <test/>がxml的に正しい構文のため、プロパティでどうこうできるものではないと思います。

そうですか。
<test/>は省略形で、<test></test>も正しい構文なので
[Xml空要素タグを使用しない]属性があったらいいなと
思ってしまいました。
諦めます。

> どうして読込側は<test/>の形式に対応していないのでしょうか?

例えば
string aaa = "";
List<T> bbb = new List<T>();
の場合
<aaa/>
<bbb/>
が出力されるのですが
phpのプログラムの問題で、両方とも配列とみなされ
やっかいだと聞きました。
ただ、php自体の問題か、その方のプログラムの問題かはわかりません。
私自身、「はじめてのWEB」,「はじめてのXML」なので
これ以上聞かれてもわかりません。

引用返信 編集キー/
■66305 / inTopicNo.11)  Re[5]: シリアライズ 空要素タグ禁止
□投稿者/ fullhappy (10回)-(2013/04/13(Sat) 23:19:58)
No66302 (魔界の仮面弁士 さん) に返信
> # タイトル編集「シリアラズ」(知り非ず?)→「シリアライズ」

ご指摘ありがとうございます。
まったく気づきませんでした。

>
> ■No66265 (fullhappy さん) に返信
>>今回、前提としてWebServiceで
>>自動でシリアライズされるので
>>XMLの結果を変更するのは難しいと思います。
>
> Webサービスというと、*.asmx を使う方法と、*.svc を使う方法がありますね。
>
> 私自身は未だに前者しか使用したことが無く、WCF については勉強不足なのですが、
> 少なくとも *.asmx の方については、SOAPExtension クラスと
> SOAPExtensionAttribute 属性を使う事で、シリアライズの前後で
> 処理を割り込みさせることができるようになっています。
> http://msdn.microsoft.com/ja-jp/library/esw638yk.aspx
>
>
了解致しました。
ハードルが高そうなのと
結果が大きい時、変換が重そうなので今回は諦め、
なんとかphp側で頑張ってもらうようにします。

みなさん、ありがとうございました。

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


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

このトピックに書きこむ

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

管理者用

- Child Tree -