2016-12-06 67 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下找到正确的设备,然后从中取出数据来创建我的传输字符串。

伟大的任何帮助在正确的方向。