簡體   English   中英

將XML片段反序列化為xsd.exe生成的類

[英]Deserialize a XML fragment to class that has been generated by xsd.exe

我有一個要讀取的xml文件,然后解釋並轉換為從xsd工具生成的各個類。 這是我正在嘗試的步驟:

  1. 我創建了一個XSD文件。
  2. 將相應的xsd文件轉換為相應的類集。
  3. 我通過一組相同的類(來自第2步)和xmlserializer制作了一些xml文件。
  4. 現在,我正在從這些xml文件中讀取信息,並且我不想將其轉換為類(從step2生成)

我正在粘貼迄今為止一直使用的代碼,在反序列化時似乎出現了一個異常, {“ XML文檔(0,0)中存在錯誤。”}

            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>

您的結束標簽不正確。 它應該是:

</xs:complexType>

並不是

</xs:complexType name="Parameters">

經過努力,我找到了解決方案:

實際上,我試圖解析一個內部元素,這是不正確的。 我已經有了xsd工具中的類,因此可以簡單地將代碼用作:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM