- PR -

文字列データのXMLシリアライズについて

1
投稿者投稿内容
チョフ
会議室デビュー日: 2004/12/24
投稿数: 7
投稿日時: 2005-02-03 22:02
XmlSerializerを使用して何かのStringのメンバを含むオブジェクトをシリアライズ
した場合、当然Stringのメンバの値の文字列に「<」などが含まれていた場合、シリアライズごのXMLでは「&lt;」などへ変換されますが、この場合と全く同じ規則で文字列のエンコード処理を行ってくれる関数などはないでしょうか。
私のイメージとしては、HttpUtility.HtmlEncode関数と同じような関数がどこかにあると思うのですが・・・

どなたがご存知の方がいらっしゃいましたらお教えください。
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2005-02-03 23:26
諸農です。

申し訳ないです。論旨が良く判りませんでした。

引用:

私のイメージとしては、HttpUtility.HtmlEncode関数と同じような関数がどこかにあると思うのですが・・・



このクラスメソッドが使えない理由、というか問題点とは
どういったものなんでしょうか?

_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
チョフ
会議室デビュー日: 2004/12/24
投稿数: 7
投稿日時: 2005-02-04 19:45
説明が足りなくて申し訳ありませんでした。

例えば以下のように宣言されたString配列があるとします。

String[] sArray = new string[]{"<",">","&"," ", "¥0" };

この配列をXmlSerializerを使用してシリアライズした場合、以下のようなXMLとなります。

<?xml version="1.0"?>
<ArrayOfString xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<string>&lt;</string>
<string>&gt;</string>
<string>&amp;</string>
<string> </string>
<string>&#x0;</string>
</ArrayOfString>


そして、プログラムの中でこのXMLをStringとして読み込み、その中の値に
特定の値が含まれているかどうかチェックする処理を行いたいのですが、その際に
Xmlパーサの使用や、XMLデシリアライズなどは行わずに直接XML内の検索を行おうと考えており、
XMLの中から検索したい文字が、"<"であれば"&lt;"へ、"¥0"であれば"&#x0;"のように変換
を行ってから検索をおこなわないと正しい検索結果が得られないと思います。

そこで、上記のような変換を行ってくれる関数を探しているのですが、HttpUtility.HtmlEncodeでは
"<"、">"、"&"などは"&lt;"、"&gt;"、"&amp"へ変換してくれましたが、"¥0"は特に変換されずそのまま
の値で、"&#x0;"へは変換してくれませんでした。

そのため、XmlSerializerがオブジェクトをXMLへ変換する際に、string値をエンコードする処理と
同じ結果を返す関数は無いかと探しております。



※ "&lt;"等を半角で入力すると自動的に">"へ変換されてしまったため、苦し紛れに全角で入力しました。

[ メッセージ編集済み 編集者: チョフ 編集日時 2005-02-04 20:23 ]

[ メッセージ編集済み 編集者: チョフ 編集日時 2005-02-05 00:34 ]
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2005-02-06 02:22
諸農です。

引用:

Xmlパーサの使用や、XMLデシリアライズなどは行わずに直接XML内の検索を行おうと考えており、



こうすることに何か理由があるのですか?
理由がないのでしたら、XmlDocument使う方が楽だと思います。
あ、でもspaceはstring.Emptyになるのかな。

コード:
private void button_Click(object sender, System.EventArgs e)
{
    listBox1.Items.Clear();
    string fname = Path.ChangeExtension(Application.ExecutablePath,".xml");
    string[] s = new string[]{"<",">","&"," ", "\0"};
    XmlSerializer x = new XmlSerializer(typeof(string[]));
    using (FileStream fs = new FileStream(fname,FileMode.Create))
    {
        x.Serialize(fs,s);   
    }
    XmlDocument d = new XmlDocument();
    d.Load(fname);
    DispNode(d.FirstChild.NextSibling);
}
private void DispNode(XmlNode node)
{
    do
    {
        if (node.HasChildNodes)
        {
            DispNode(node.ChildNodes[0]);
        }
        else
        {
            if (node.InnerText == string.Empty)
                listBox1.Items.Add( "Empty" );
            else if (node.InnerText == "")
                listBox1.Items.Add( "\"\"" );
            else if (node.InnerText == " ")
                listBox1.Items.Add( "space" );
            else if (node.InnerText == "\0")
                listBox1.Items.Add("null文字");
            else
                listBox1.Items.Add(node.InnerText);
        }
    }while((node = node.NextSibling) != null);
}




引用:

※ "&lt;"等を半角で入力すると自動的に">"へ変換されてしまったため、苦し紛れに全角で入力しました。



codeタグ使えば大丈夫ですよ。

_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
チョフ
会議室デビュー日: 2004/12/24
投稿数: 7
投稿日時: 2005-02-14 20:19
返事が遅くなり申し訳ありませんでした。

サンプルのご提示ありがとうございました。

引用:

こうすることに何か理由があるのですか?
理由がないのでしたら、XmlDocument使う方が楽だと思います。



処理を組み込もうとしている部分が、パフォーマンスを意識しなければならない部分のため、
なるべく軽い処理にしようと考えていたためです。

そして、検索対象となる文字も
コード:
"\0"

のような制御コードが設定されることを想定しているため、
XMLへ変換した場合に
コード:
"\0" → "&#x0;"

のように何らかのエンコードがされることから、変換後の値を
直接、XMLから検索すればよいと考えていました。

しかし、この方法だとXMLに変換した場合に特にエンコードされない文字を検索しようとした場合は
タグ名などでヒットする可能性もあるのでだめそうですね・・・。

やはり、ご提示いただいたサンプルのようにパーサを使用したほうが良さそうですね。




[ メッセージ編集済み 編集者: チョフ 編集日時 2005-02-14 20:20 ]
taro
ぬし
会議室デビュー日: 2003/10/20
投稿数: 316
投稿日時: 2005-02-15 02:15
大して数もないので1回自作してしまうと楽ですよ。
ご参考までに。
http://ash.or.jp/java/htmlencode.htm
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2005-02-15 16:14
そして、検索対象となる文字も
コード:

"\0"
のような制御コードが設定されることを想定しているため、
XMLへ変換した場合に
コード:

"\0" → "&#65533;"
のように何らかのエンコードがされることから、変換後の値を
直接、XMLから検索すればよいと考えていました。
-------------------------------- ????????????????
XML1.0
[2] Char ::= #x9 | #xA | #xD |
[#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]
/* any Unicode character, excluding the surrogate blocks, FFFE, and FFFF. */

XML1.1
[2] Char ::= [#x1-#xD7FF] |
[#xE000-#xFFFD] | [#x10000-#x10FFFF]
/* any Unicode character, excluding the surrogate blocks, FFFE, and FFFF. */
[2a] RestrictedChar ::= [#x1-#x8] | [#xB-#xC] | [#xE-#x1F] | [#x7F-#x84] | [#x86-#x9F]

バイトのゼロは整形式の文字じゃないので、どのXMLエディタでもすぐ警告される
でしょう。パーサーは警告出すか、握りつぶすか?、CDATAにも入りません。

バイナリーXML の「救い」を祈るしかないのでは。
XMLは最初に文書指向の人々が立ち上げた物ですから
本当は、バイナリーデータの標準パッケージを求めていた、
データ指向の人にはいまいち満足いかないのかも.
HTTP で通りがよい は別にして


[ メッセージ編集済み 編集者: MMX 編集日時 2005-02-15 17:37 ]
1

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