【问题标题】:xsd.exe newbie - I created my .cs and .xsd now how do I read in the xml?xsd.exe 新手 - 我现在创建了 .cs 和 .xsd 我如何读取 xml?
【发布时间】:2011-11-02 00:03:39
【问题描述】:

读取 xml 文件以实例化通过 xsd.exe 生成的 .cs 对象集合的最佳实践方法是什么?

我使用 xsd.exe 生成一个 .xsd 文件(架构),然后生成一个 .cs 文件。我按照这里的步骤操作:http://ctrlf5.net/?p=235,效果很好。

我不想使用 XmlReader 并编写一堆代码来导航文档树,同时设置所有公共设置器。我的 xml 文档又长又痛苦。我只想点击简单的按钮并收集我的收藏。新手,我刚刚在 xsd 上度过了一个很棒的时刻——它让我的 .cs 文件变得多么酷——但是如果我现在必须编写 500 行代码来实例化我的类——那就太棒了。现在有一种简单的方法可以实例化我的收藏,而我只是不知道它是什么或如何用谷歌搜索它,这才有意义。回复这个已经回答的问题很高兴接受。

这是我的 xml 和代码的样子:

<?xml version = "1.0" ?>
<MY_OBJECT>
  <UNIQUE_ID>ABC</UNIQUE_ID>
  <TYPE>TEST</TYPE>
  <CLASSALIST>
    <CLASSA>
      <A>0</A>
      <B>0</B>
      <C>2598960</C>
      <HS>
        <H>
          <DESCRIPTION>MYDESC</DESCRIPTION>
          <ADDITIONAL>0</ADDITIONAL>
        </H>
      </HS>
    </CLASSA>
  </CLASSALIST>
  <BONUSES>
    <BONUS>
      <BONUS_TYPE>Bonus Schedule</BONUS_TYPE>
      <BONUS_DATA>
        <ALPHA>1</ALPHA>
        <BETA>4</BETA>        
      </BONUS_DATA>
    </BONUS>
  </BONUSES>
  <REVISION>A</REVISION>
  <CONDITION>
    <GENERAL></GENERAL>
    <EXCEPTION></EXCEPTION>
  </CONDITION>
  <ACTIONABLE>True</ACTIONABLE>
  <VERSION>12345</VERSION>
  <COMMENTS></COMMENTS>
</MY_OBJECT>

这里我尝试反序列化为 List:

[Test]
public void AutoXmlSampleList()
{
    var xs = new XmlSerializer(typeof(List<MY_OBJECT>));
    List<MY_OBJECT> list;
    using (var reader = XmlReader.Create(_inputFilename2))
    {
        list = (List<MY_OBJECT>)xs.Deserialize(reader);
    }

    Assert.AreEqual("ABC", list[0].UNIQUE_ID);

}

这是错误信息:

System.InvalidOperationException : Unable to generate a temporary class (result=1).
error CS0030: Cannot convert type 'Test.MY_OBJECTCLASSALISTCLASSA[]' to 'Test.MY_OBJECTCLASSALISTCLASSA'
error CS0030: Cannot convert type 'Test.MY_OBJECTBONUSESBONUS[]' to 'Test.MY_OBJECTBONUSESBONUS'
error CS0030: Cannot convert type 'Test.MY_OBJECTCLASSALISTCLASSAHSH[]' to 'Test.MY_OBJECTCLASSALISTCLASSAHSH'
error CS0029: Cannot implicitly convert type 'Test.MY_OBJECTCLASSALISTCLASSA' to 'Test.MY_OBJECTCLASSALISTCLASSA[]'
error CS0029: Cannot implicitly convert type 'Test.MY_OBJECTBONUSESBONUS' to 'Test.MY_OBJECTBONUSESBONUS[]'
error CS0029: Cannot implicitly convert type 'Test.MY_OBJECTCLASSALISTCLASSAHSH' to 'Test.MY_OBJECTCLASSALISTCLASSAHSH[]'

如果我尝试反序列化而不是 List:

[Test]
public void AutoXmlSampleNotList()
{
    var xs = new XmlSerializer(typeof(MY_OBJECT));
    MY_OBJECT myObject;
    using (var reader = XmlReader.Create(_inputFilename2))
    {
        myObject = (MY_OBJECT)xs.Deserialize(reader);
    }

    Assert.AreEqual("ABC", myObject.UNIQUE_ID);

}

这会导致类似的错误:

System.InvalidOperationException : Unable to generate a temporary class (result=1).
error CS0030: Cannot convert type 'Test.MY_OBJECTCLASSALISTCLASSA[]' to 'Test.MY_OBJECTCLASSALISTCLASSA'
error CS0030: Cannot convert type 'Test.MY_OBJECTBONUSESBONUS[]' to 'Test.MY_OBJECTBONUSESBONUS'
error CS0030: Cannot convert type 'Test.MY_OBJECTCLASSALISTCLASSAHSH[]' to 'Test.MY_OBJECTCLASSALISTCLASSAHSH'
error CS0029: Cannot implicitly convert type 'Test.MY_OBJECTCLASSALISTCLASSA' to 'Test.MY_OBJECTCLASSALISTCLASSA[]'
error CS0029: Cannot implicitly convert type 'Test.MY_OBJECTBONUSESBONUS' to 'Test.MY_OBJECTBONUSESBONUS[]'
error CS0029: Cannot implicitly convert type 'Test.MY_OBJECTCLASSALISTCLASSAHSH' to 'Test.MY_OBJECTCLASSALISTCLASSAHSH[]'

【问题讨论】:

  • 您正在寻找 XmlSerializer。查看其他 Stackoverflow 帖子 stackoverflow.com/questions/792976/…
  • 你也不应该使用 xsd.exe。如果可以使用 svcutil.exe 生成的类,那就更好了。
  • 只是反序列化 MY_OBJECT 而不是 List&lt;MY_OBJECT&gt;
  • 不就是一个 count == 1 的列表吗?
  • 是否可以将生成的 C# 代码和/或 XML 模式上传到某处?这个问题似乎很微妙:)

标签: c# xml instance xsd.exe


【解决方案1】:
var xs = new XmlSerializer(typeof(List<YourClassGeneratedByXsd>));
List<YourClassGeneratedByXsd> list;
using (var reader = XmlReader.Create(fileName))
{
    list = (List<YourClassGeneratedByXsd>)xs.Deserialize(reader);
}

【讨论】:

  • Thomas,我收到了同样的错误信息(错误 CS0030 等)。会不会是自动生成的 *.cs 需要一些手动编辑?
  • @sapbucket,不知道... xsd.exe 不支持 XML Schema 的所有功能,也许您的 XSD 使用了一些不支持的功能
  • 为什么是List&lt;T&gt; 而不仅仅是T?据我所知,XML 只有一个根对象。
  • @leppie,OP 说他想“实例化一个 .cs 对象的集合”,所以我假设 XML 包含一个集合。但是现在XML已经发布了,它似乎是一个单一的对象......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多