将XML片段反序列化为由xsd.exe生成的类

时间:2013-03-30 10:52:05

标签: c# .net xml xsd xsd.exe

我有一个xml文件,我想读它,然后解释并转换为从xsd工具生成的各个类。以下是我正在尝试的步骤:

  1. 我创建了一个XSD文件。
  2. 将相应的xsd文件转换为相应的类集。
  3. 我通过同一组类(来自第2步)和xmlserializer制作了一些xml文件。
  4. 现在我正从这些xml文件中读回来,我不想把它转换为类(从第2步生成)
  5. 我正在粘贴我迄今为止所使用的代码,当我反序列化时,我似乎得到了一个例外, {“XML文档中存在错误(0,0)。”} < / p>

                var doc = XDocument.Load(filePath);
    
            var query2 = from b in doc.Root.Descendants()
                         select b;
    
            foreach (var item in query2)
            {
                switch (item.Name.LocalName)
                {
                    case "SomeStringValue": 
                        XmlSerializer srz = new XmlSerializer(typeof(SomeClassGeneratedfromXSD));
                        var writer=item.CreateReader();
                        parameterFromFile.SomeProperty = (SomeClassGeneratedfromXSD)srz.Deserialize(writer);
                        //srz.Deserialize(item);
                        break;
    

    我正在粘贴我的xsd看起来的片段:

    <xs:complexType name="Parameters">
    <xs:all>
      <xs:element name="A">
        <xs:complexType>
          <xs:simpleContent>
            <xs:extension base="mstns:Restricted8CharString">
              <xs:attribute name="Caption" use="required" fixed="Caption for A">
                <xs:simpleType>
                  <xs:restriction base="xs:string"></xs:restriction>
                </xs:simpleType>
              </xs:attribute>
              <xs:attribute name="ActionWhenMaxReached" use="required">
                <xs:simpleType>
                  <xs:restriction base="xs:short">
                    <xs:pattern value="[1-3]"></xs:pattern>
                  </xs:restriction>
                </xs:simpleType>
              </xs:attribute>
              <xs:attribute name="Expression" type="xs:string" default="0" />
            </xs:extension>
          </xs:simpleContent>
        </xs:complexType>
      </xs:element>
      <xs:element name="B">
        <xs:complexType>
          <xs:simpleContent>
            <xs:extension base="xs:short">
              <xs:attribute name="Caption" use="prohibited">
                <xs:simpleType>
                  <xs:restriction base="xs:string"></xs:restriction>
                </xs:simpleType>
              </xs:attribute>
              <xs:attribute name="ActionWhenMaxReached" use="required">
                <xs:simpleType>
                  <xs:restriction base="xs:short">
                    <xs:pattern value="[1-3]"></xs:pattern>
                  </xs:restriction>
                </xs:simpleType>
              </xs:attribute>
              <xs:attribute name="Expression" type="xs:string" default="0" />
            </xs:extension>
          </xs:simpleContent>
        </xs:complexType>
      </xs:element>
      </xs:all>
      </xs:complexType>
    

2 个答案:

答案 0 :(得分:0)

您的结束标记不正确。它应该是:

</xs:complexType>

而不是

</xs:complexType name="Parameters">

答案 1 :(得分:0)

经过努力,我找到了解决方案:

实际上我试图解析一个内部元素,这是不正确的;我已经使用了xsd工具中的类,所以我可以简单地使用代码:

XmlSerializer serializer = new XmlSerializer(typeof(RootClass));
        using (TextReader reader = new StreamReader(filePath))
        {
            RootClass parameterFromFile = (RootClass)serializer.Deserialize(reader);
        }