xsd2code - 解析xml文件出现问题

3
过去,我手动创建自己的xml序列化类。但现在我想要自动完成这个过程。 于是我发现了微软的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中反序列化所有数据。 例如: Empty properties 我的Xsd2Code设置: Xsd2Code my settings 有人能给我建议吗:
- 我做错了什么以及如何纠正这个问题? - 或者 - 为我的XML(上面的XML)提供另一个自动化的工作解决方案。
非常感谢您提前提供的所有建议。

你找到原因了吗?我今天遇到了完全相同的问题:没有错误,但是当XML与XSD不匹配时,数据会丢失! - dstj
当你的xml文件中有超出你所加载的xsd文件的额外字段时,就会发生这种情况。我曾经因为错误地将xml元素放在其他位置而遇到过这个问题。 - Sergey Kucher
2个回答

0
在我的情况下,是将订单参数添加到 XmlElementAttribute 中(即 Order = 4)。
如果您删除订单参数,它就可以正常工作。我找不到的是一种方法,可以防止 XSD2CODE 在生成类时包含订单参数。

如果你实际上不需要一个订单,可以通过将xsd中的顺序更改为"all"来防止它。 - Sergey Kucher

0

有几个问题可能会导致这种情况:

  1. 在您的xml中,元素的顺序无效。如果您实际上不关心顺序,请将其替换为xsd中的元素(它将从KenE答案生成的代码中删除XmlElementAttribute)。
  2. 或者更简单的情况是xml中存在错误,例如向现有元素添加了子元素(xsd2code在反序列化期间不会失败,但会忽略该元素)

希望能有所帮助


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接