使用C#中的列表列表导入XML

时间:2016-12-06 19:50:53

标签: c# xml list import

我想将此XML文件导入C#。

<?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)。 ---&GT; 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,Boolean checkType)

有什么建议吗?这样做的更好方法是什么?什么?

2 个答案:

答案 0 :(得分:0)

好的,现在我已经导入了一个我想要使用的漂亮而整洁的信息结构。我程序的一部分使用结构中的所有信息来创建用户界面。程序的另一部分必须决定在按下其中一个按钮或更改滑块时该怎么做。后一部分自动获取三条信息,我无法更改执行此操作的代码。我得到的信息是&#34; RootName&#34;,&#34; DeviceName&#34;和&#34;数字&#34;在&#34;参数&#34;类。

所以我需要做的是搜索matchin RootName,然后搜索匹配的DeviceName,并在&#34; PUTCMD&#34;中获取该DeviceNames字符串。并添加与我获得的数字相对应的参数名称。

有这样做的聪明方法吗?在正确的Root下找到正确的Device,然后从中获取数据以创建我的传输字符串。

在正确的方向上提供任何帮助。

答案 1 :(得分:-1)

谢谢,如果我创建一个新项目并输入我随更改发布的代码,那么您的修复工作正常。但它在我的原始程序中不起作用。我将不得不继续收集信息来描述问题。

将其从测试程序中复制粘贴使其工作时有一个例外。我在测试程序中做了一个错误的操作,输入了类似roots .Roots [1] .Devices.Count(),并在那里工作。但是当复制回原始程序时,我不得不删除()因为它不是方法。