3

過去に、独自の xml シリアル化クラスを手動で作成しました。しかし今、私はそれを自動的にやりたいと思っています。そこで、Microsoft の XSD ツールを見つけました。残念ながら、このユーティリティ (CS030 など) にはバグがあります。しかし次に、素晴らしいオープン ソース ツール XSD2CODE http://xsd2code.codeplex.com/を見つけました。

すべての xml データが逆シリアル化されているわけではないことに気付くまで、すべてがうまくいっていました (笑)。

私のXML:

<?xml version="1.0" encoding="utf-8" ?>
<MySettings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <AdminPassword>Admn1234</AdminPassword>
        <ImagesFolder></ImagesFolder>
    <Resolutions>
        <Resolution id="1024x768">
            <Width>1024</Width>
            <Height>768</Height>
            <Panel id="top">
                <Height>603</Height>
                <LocationOnMainForm>
                    <X>0</X>
                    <Y>0</Y>
                </LocationOnMainForm>
                <Background>1_panel_top_background.jpg</Background>
                <Buttons>
                    <Button id="pbMainTopComp">
                        <Background>panel_top_btn_info.jpg</Background>
                        <Location>
                            <X>27</X>
                            <Y>123</Y>
                        </Location>
                        <OnClickOpenLink>http://www.google.com</OnClickOpenLink>
                    </Button>
                    <Button id="pbMainTopSelf">
                        <Background>panel_top_btn_self.jpg</Background>
                        <Location>
                            <X>360</X>
                            <Y>123</Y>
                        </Location>
                        <OnClickOpenLink>http://www.yahoo.com</OnClickOpenLink>
                    </Button>
                </Buttons>
            </Panel>
            <Panel id="bottom">
                <LocationOnMainForm>
                    <X>0</X>
                    <Y>603</Y>
                </LocationOnMainForm>
                <Height>165</Height>
                <Background>panel_bottom_background.jpg</Background>
                <Buttons>
                    <Button id="pbMainBottomPages">
                        <Background>panel_bottom_btn_pages.jpg</Background>
                        <Location>
                            <X>38</X>
                            <Y>39</Y>
                        </Location>
                        <OnClickOpenLink/>
                    </Button>
                    <Button id="pbMainBottomReport">
                        <Background>panel_bottom_btn_report.jpg</Background>
                        <Location>
                            <X>344</X>
                            <Y>39</Y>
                        </Location>
                        <OnClickOpenLink>http://www.bing.com</OnClickOpenLink>
                    </Button>
                </Buttons>
            </Panel>
        </Resolution>
    </Resolutions>
</MySettings>

標準的な方法を使用して逆シリアル化すると、エラーが発生します。

 MySettings mySettings = new MySettings();

using (TextReader textReader = new StreamReader(@"settings_test.xml"))
        {
            XmlSerializer xSerializer = new XmlSerializer(typeof(MySettings));
            mySettings = (MySettings)xSerializer.Deserialize(textReader);
        }

逆シリアル化メソッドに組み込まれた Xsd2Code を使用する場合:

    MySettings mySettings = new MySettings();

    bool isOk = MySettings.LoadFromFile(@"settings_test.xml", out mySettings);

    string pass = mySettings.AdminPassword;


    foreach (MySettingsResolutionsResolution item in mySettings.Resolutions)
    {
        string height = item.Height;

        foreach (MySettingsResolutionsResolutionPanel panel in item.Panel)
        {
            string bckg = panel.Background;

            foreach (MySettingsResolutionsResolutionPanelButtonsButton btn in panel.Buttons)
            {
                string btnBckg = btn.Background;
            }
        }
    }

エラーはありませんが、すべてのデータがxmlから逆シリアル化されているわけではありません。例えば: 空のプロパティ

私の Xsd2Code 設定: Xsd2Code私の設定

誰でも私にアドバイスできますか:

  • 私が間違っていたことと、これを修正する方法は?
  • また
  • XML (上記の XML) の別の自動化された作業ソリューションを提案します。

すべての提案を前もって感謝します。

4

2 に答える 2

0

いくつかの問題がこの状況を引き起こす可能性があります。

  1. ブロック内の xml の要素の順序が無効です。実際に順序を気にしない場合は、xsd の要素に置き換えてください (KenE の回答から生成されたコードから XmlElementAttribute が削除されます)。
  2. または、より単純なケースは、既存の要素への追加など、xml の誤りです (xsd2code は淡水化中に失敗しませんが、要素は無視されます)。

それが役に立てば幸い

于 2013-08-08T07:52:14.180 に答える