2016-12-06 4 views
-1

Ich möchte diese XML-Datei in C# importieren.Importieren von XML mit Listen von Listen in 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> 

Ich habe diese Klassen erstellt, es zu tragen:

[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; 
} 

Und dann dieser Code in C# importieren:

  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); 
      } 

Aber ich einen Fehler und ich kippe um nur erhalten Es hat eine Reihe von Lösungen getestet, um es ohne Erfolg zum Laufen zu bringen. Der Fehler, den ich bekommen ist:

System.InvalidOperationException: Es ist ein Fehler in XML-Dokument (2, 2). ---> System-MethodAccessException: Versuch durch Methode 'Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderYamahaAmplifier.Read5_YamahaAmplifier (Boolean, Boolean)', um auf die Methode'HSPI_YAMAHA_RECEIVER.Util + YamahaAmplifier..ctor() zuzugreifen. bei Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderYamahaAmplifier.Read5_YamahaAmplifier (Booleanb isNullable, Boolean Checktype)

Irgendwelche Vorschläge? Ein besserer Weg, es zu tun? Etwas?

Antwort

-1

Danke, Ihre Korrektur funktioniert, wenn ich ein neues Projekt erstelle und einfach den Code einfüge, den ich mit Ihren Änderungen gepostet habe. Aber es funktioniert nicht in meinem ursprünglichen Programm. Ich werde weiterhin Informationen sammeln müssen, um das Problem zu beschreiben.


Kopieren Sie es aus dem Testprogramm einfügen, damit es mit einer Ausnahme funktioniert. Ich hatte im Testprogramm einen Fehler gemacht, indem ich etwas wie roots.Roots [1] .Devices.Count() eingegeben hatte und das funktionierte dort. Aber beim Zurückkopieren zum ursprünglichen Programm musste ich das() entfernen, da es keine Methode ist.

0

Ok, jetzt habe ich eine nette und ordentliche Struktur von Informationen importiert, die ich verwenden möchte. Ein Teil meines Programms verwendet alle Informationen in der Struktur, um eine Benutzerschnittstelle zu erstellen. Ein anderer Teil des Programms muss entscheiden, was zu tun ist, wenn eine der Tasten gedrückt wird oder die Slider geändert werden. Dieser letzte Teil erhält automatisch drei Informationen, ich kann den Code, der das tut, nicht ändern. Die Information, die ich bekomme, ist der "RootName", "DeviceName" und "Number" unter "Parameter" -Klasse.

Also was ich tun muss, ist die Suche nach der Matchin RootName, und darunter, die passende DeviceName und nehmen Sie diese DeviceNames Zeichenfolge in "Putcmd" und fügen Sie den Parameternamen, der der Zahl I erhalten.

Gibt es eine kluge Möglichkeit, dies zu tun? Finden Sie das richtige Gerät unter dem richtigen Root und nehmen Sie dann die Daten daraus, um meine Übertragungsfolge zu erstellen.

Großartig für jede Hilfe in die richtige Richtung.