2014-09-02 61 views
0

我想反序列化和使用xsd.exe工具創建的對象的xml文件。當我嘗試運行示例應用程序時,出現以下異常:InvalidOperationException - XML文檔(1,1)中存在錯誤。我在這裏做錯了什麼? 這裏是我的代碼:反序列化XML無效操作異常

示例XML文件

<?xml version="1.0" encoding="utf-8"?> 
<patient> 
<pr> 
<fname>Cindy </fname> 
<lname>Knapp </lname> 
<id>1 </id> 
</pr> 
<pr> 
<fname>Regie </fname> 
<lname>Miller </lname> 
<id>2 </id> 
</pr> 
<ad> 
    <id>1</id> 
    <streetnumber>1200 NW</streetnumber> 
    <city>Miami </city> 
    <state>FL</state> 
    <zip>34488</zip> 
</ad> 
<ad> 
    <id>2</id> 
    <streetnumber>1299 NE</streetnumber> 
    <city>NY </city> 
    <state>NY</state> 
    <zip>9032</zip> 
</ad> 
</patient> 

這裏是產生

//------------------------------------------------------------------------------ 
// <auto-generated> 
//  This code was generated by a tool. 
//  Runtime Version:4.0.30319.18444 
// 
//  Changes to this file may cause incorrect behavior and will be lost if 
//  the code is regenerated. 
// </auto-generated> 
//------------------------------------------------------------------------------ 

using System.Xml.Serialization; 

// 
// This source code was auto-generated by xsd, Version=4.0.30319.17929. 
// 


/// <remarks/> 
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] 
[System.SerializableAttribute()] 
[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.ComponentModel.DesignerCategoryAttribute("code")] 
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)] 
[System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)] 
public partial class patient { 

    private patientPR[] prField; 

    private patientAD[] adField; 

    /// <remarks/> 
    [System.Xml.Serialization.XmlElementAttribute("pr")] 
    public patientPR[] pr { 
     get { 
      return this.prField; 
     } 
     set { 
      this.prField = value; 
     } 
    } 

    /// <remarks/> 
    [System.Xml.Serialization.XmlElementAttribute("ad")] 
    public patientAD[] ad { 
     get { 
      return this.adField; 
     } 
     set { 
      this.adField = value; 
     } 
    } 
} 

/// <remarks/> 
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] 
[System.SerializableAttribute()] 
[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.ComponentModel.DesignerCategoryAttribute("code")] 
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)] 
public partial class patientPR { 

    private string fnameField; 

    private string lnameField; 

    private int idField; 

    /// <remarks/> 
    public string fname { 
     get { 
      return this.fnameField; 
     } 
     set { 
      this.fnameField = value; 
     } 
    } 

    /// <remarks/> 
    public string lname { 
     get { 
      return this.lnameField; 
     } 
     set { 
      this.lnameField = value; 
     } 
    } 

    /// <remarks/> 
    public int id { 
     get { 
      return this.idField; 
     } 
     set { 
      this.idField = value; 
     } 
    } 
} 

/// <remarks/> 
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] 
[System.SerializableAttribute()] 
[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.ComponentModel.DesignerCategoryAttribute("code")] 
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)] 
public partial class patientAD { 

    private int idField; 

    private string streetnumberField; 

    private string cityField; 

    private string stateField; 

    private ushort zipField; 

    /// <remarks/> 
    public int id { 
     get { 
      return this.idField; 
     } 
     set { 
      this.idField = value; 
     } 
    } 

    /// <remarks/> 
    public string streetnumber { 
     get { 
      return this.streetnumberField; 
     } 
     set { 
      this.streetnumberField = value; 
     } 
    } 

    /// <remarks/> 
    public string city { 
     get { 
      return this.cityField; 
     } 
     set { 
      this.cityField = value; 
     } 
    } 

    /// <remarks/> 
    public string state { 
     get { 
      return this.stateField; 
     } 
     set { 
      this.stateField = value; 
     } 
    } 

    /// <remarks/> 
    public ushort zip { 
     get { 
      return this.zipField; 
     } 
     set { 
      this.zipField = value; 
     } 
    } 
} 

在主函數類,我試圖反序列化的XML文件。

class Program 
    { 
     static void Main(string[] args) 
     { 
      patient pr = new patient(); 
      XmlSerializer serializer = new XmlSerializer(typeof(patient)); 
      FileStream myStream = new FileStream(@"C:\com\dss\VXReports\XSD Document\EXAMPLE.CS", FileMode.Open); 
      pr = (patient)serializer.Deserialize(myStream); 
      string kr = string.Empty; 
     } 
    } 

Stack Trace: 
    at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events) 
    at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle) 
    at TestXMLFile.Program.Main(String[] args) in c:\com\dss\VXReports\Clinical Quality Measure\TestXMLFile\TestXMLFile\Program.cs:line 17 
    at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) 
    at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 
    at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
    at System.Threading.ThreadHelper.ThreadStart() 
+2

「C:\ COM \ DSS \ VXReports \ XSD文件\ EXAMPLE.CS」 - 「的.cs」 是一個不同尋常的擴展XML文件。 – 2014-09-03 00:14:17

+0

@AlexeiLevenkov,這是問題。我花了4個多小時試圖弄清楚代碼有什麼問題,而且我甚至沒有注意到文件名後面的.cs擴展名。謝謝。 – user3802347 2014-09-03 00:58:43

+0

訣竅是注意異常消息。這不是騙你。請記住,「一旦你消除了不可能的事物,無論如何,儘管不可能,是事實。因此,即使您的XML文檔看起來很完美,您對XML序列化程序的輸入也不是有效的XML文檔。這意味着您完美的XML文檔不是XML序列化程序的輸入... – 2014-09-03 02:03:56

回答

0

我將文件擴展名從.cs更改爲.xml。我還在該項目中創建了一些部分類,併爲這些類添加了一些XML裝飾。使用xsd.exe自動生成的類中沒有任何更改。 我的主類

static void Main(string[] args) 
     { 
      patient pr = new patient(); 
      XmlSerializer serializer = new XmlSerializer(typeof(patient)); 
      FileStream myStream = new FileStream(@"C:\com\dss\VXReports\XSD Document\EXAMPLE.XML", FileMode.Open); 
      pr = (patient)serializer.Deserialize(myStream); 
      string kr = string.Empty; 
     } 

新的部分類:

[Serializable, XmlRoot("patient")] 
    public partial class patient 
    { 
     [XmlElement("pr")] 
     public patientPR[] pr { get; set; } 
     [XmlElement("ad")] 
     public patientAD[] ad { get; set; } 
    } 

    [Serializable, XmlType("pr")] 
    public partial class patientPR 
    { 
     [XmlElement("fname")] 
     public string fname { get; set; } 
     [XmlElement("lname")] 
     public string lname { get; set; } 
     [XmlElement("id")] 
     public int id { get; set; } 
    } 

    [Serializable, XmlType("ad")] 
    public partial class patientAD 
    { 
     [XmlElement("id")] 
     public int id { get; set; } 
     [XmlElement("streetnumber")] 
     public string streetnumber { get; set; } 
     [XmlElement("city")] 
     public string city { get; set; } 
     [XmlElement("state")] 
     public string state { get; set; } 
     [XmlElement("zip")] 
     public ushort zip { get; set; } 
    } 
1

您的代碼對我來說工作得很好。如果您在XML中具有該功能,請從頂部刪除「示例XML文件」。如果你沒有那個,你可能會遇到一些問題,如不可見的字符或者編碼衝突。在SO上查看此鏈接,例如:Deserialization error in XML document(1,1)