2016-12-06 42 views
-1

我想將這個XML文件導入到C#中。用C#列表導入XML#

<?xml version="1.0" encoding="UTF-8"?> 
<YamahaAmplifier> 
<Root> 
    <RootName>SYS</RootName> 
    <UseRoot>YES</UseRoot> 
    <Device> 
    <DeviceName>MODELNAME</DeviceName> 
    <UseFunction>YES</UseFunction> 
    <GETCMD>@SYS:MODELNAME=?</GETCMD> 
    <Parameter> 
     <Number>1</Number> 
     <Type>SINGLEVAL</Type> 
     <Name>Character Code: Ascii, Variable Length (1 to 16 characters)</Name> 
    </Parameter> 
    </Device> 
    <Device> 
    <DeviceName>SPPATTERN1AMP</DeviceName> 
    <UseFunction>YES</UseFunction> 
    <PUTCMD>@SYS:SPPATTERN1AMP=</PUTCMD> 
    <GETCMD>@SYS:SPPATTERN1AMP=?</GETCMD> 
    <Parameter> 
     <Number>1</Number> 
     <Type>SINGLEVAL</Type> 
     <Name>7ch Normal</Name> 
    </Parameter> 
    <Parameter> 
     <Number>2</Number> 
     <Type>SINGLEVAL</Type> 
     <Name>7ch +1ZONE</Name> 
    </Parameter> 
    <Parameter> 
     <Number>3</Number> 
     <Type>SINGLEVAL</Type> 
     <Name>7ch +2ZONE</Name> 
    </Parameter> 
    <Parameter> 
     <Number>4</Number> 
     <Type>SINGLEVAL</Type> 
     <Name>7ch +FRONT</Name> 
    </Parameter> 
    <Parameter> 
     <Number>5</Number> 
     <Type>SINGLEVAL</Type> 
     <Name>7ch +FPR</Name> 
    </Parameter> 
    </Device> 
</Root> 
<Root> 
    <RootName>SYS2</RootName> 
    <UseRoot>YES</UseRoot> 
    <Device> 
    <DeviceName>MODELNAME2</DeviceName> 
    <UseFunction>YES</UseFunction> 
    <GETCMD>@SYS:MODELNAME=?</GETCMD> 
    <Parameter> 
     <Number>1</Number> 
     <Type>SINGLEVAL</Type> 
     <Name>Character Code: Ascii, Variable Length (1 to 16 characters)</Name> 
    </Parameter> 
    </Device> 
    <Device> 
    <DeviceName>SPPATTERN1AMP2</DeviceName> 
    <UseFunction>YES</UseFunction> 
    <PUTCMD>@SYS:SPPATTERN1AMP=</PUTCMD> 
    <GETCMD>@SYS:SPPATTERN1AMP=?</GETCMD> 
    <Parameter> 
     <Number>1</Number> 
     <Type>SINGLEVAL</Type> 
     <Name>7ch Normal</Name> 
    </Parameter> 
    <Parameter> 
     <Number>2</Number> 
     <Type>SINGLEVAL</Type> 
     <Name>7ch +1ZONE</Name> 
    </Parameter> 
    <Parameter> 
     <Number>3</Number> 
     <Type>SINGLEVAL</Type> 
     <Name>7ch +2ZONE</Name> 
    </Parameter> 
    </Device> 
</Root> 
</YamahaAmplifier> 

我已經創建了這些類來實現它:

[Serializable, XmlRoot("YamahaAmplifier")] 
public class YamahaAmplifier 
{ 
    [XmlArray(ElementName = "Root")] 
    public List<Root> Roots = new List<Root>(); 
} 

[Serializable()] 
public class Root 
{ 
    [XmlElement("RootName")] 
    public string RootName; 
    [XmlElement("UseRoot")] 
    public string UseRoot; 
    [XmlArray("Device")] 
    public List<Device> Devices = new List<Device>(); 
} 

[Serializable()] 
public class Device 
{ 
    [XmlElement("DeviceName")] 
    public string DeviceName; 
    [XmlElement("UseFunction")] 
    public string UseFunction; 
    [XmlElement("GETCMD")] 
    public string GETCMD; 
    [XmlElement("PUTCMD")] 
    public string PUTCMD; 
    [XmlArray("Parameter")] 
    public List<Parameter> Parameters = new List<Parameter>(); 
} 

[Serializable()] 
public class Parameter 
{ 
    [XmlElement("Number")] 
    public int Number; 
    [XmlElement("Type")] 
    public string Type; 
    [XmlElement("Name")] 
    public string Name; 
} 

,然後將此代碼導入到C#:

  try 
      { 
       using (FileStream reader = new FileStream("C:\\Civview\\YNCA_Command_List_RX-A3000_U.xml", FileMode.Open)) 
       { 
        XmlSerializer ser = new XmlSerializer(typeof(YamahaAmplifier)); 
        o = ser.Deserialize(reader) as YamahaAmplifier; 
       } 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine(e); 
      } 

但我得到一個錯誤,我只是不能得到解決它已經測試了許多解決方案,使其無法成功地運行。 我得到的錯誤是:

System.InvalidOperationException:XML文檔(2,2)中存在錯誤。 ---> System-MethodAcessException:嘗試通過方法'Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderYamahaAmplifier.Read5_YamahaAmplifier(Boolean,Boolean)'訪問方法'HSPI_YAMAHA_RECEIVER.Util + YamahaAmplifier..ctor()失敗。 在Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderYamahaAmplifier.Read5_YamahaAmplifier(Booleanb ISNULLABLE,布爾checkType)

有什麼建議?一個更好的方法呢?什麼?

回答

-1

謝謝,如果我創建一個新項目並輸入您的更改發佈的代碼,您的修復工作。但它在我的原始程序中不起作用。我將不得不繼續收集信息來描述問題。


從測試程序中複製粘貼它使其只有一個例外。我在測試程序中輸入了像root.Roots [1] .Devices.Count()那樣的錯誤,並在那裏工作。但是當複製回原始程序時,我不得不刪除(),因爲它不是一個方法。

0

好的,所以現在我已經導入了一個我想要使用的漂亮而整齊的信息結構。我的程序的一部分使用結構中的所有信息來創建用戶界面。該程序的另一部分必須決定如果按下其中一個按鈕或切片改變該怎麼辦。後一部分自動獲取三條信息,我無法更改這樣做的代碼。我得到的信息是「參數」類下的「RootName」,「DeviceName」和「Number」。

因此,我需要做的是搜索matchin RootName,然後在匹配的DeviceName下,在「PUTCMD」中取出該DeviceName字符串,並添加與我獲得的Number對應的參數名稱。

有沒有這樣做的巧妙方法?在正確的Root下找到正確的設備,然後從中取出數據來創建我的傳輸字符串。

偉大的任何幫助在正確的方向。