2016-12-06 3 views
-1

이 XML 파일을 C#으로 가져 오려고합니다.C에서 목록 목록으로 XML 가져 오기

[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 번호를 가져올 수 :

<?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> 

나는 그것을 수행하기 위해 이러한 클래스를 만들었습니다

  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-MethodAccessException : '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

새 프로젝트를 만들고 변경 사항과 함께 게시 한 코드를 입력하면 문제가 해결됩니다. 하지만 원래 프로그램에서는 작동하지 않습니다. 문제를 설명하기 위해 계속해서 정보를 수집해야합니다.


테스트 프로그램에서 붙여 넣기 복사는 한 가지 예외가 있습니다. 나는 뿌리 같은 것을 타이핑하는 테스트 프로그램에서 실수를 저질 렀다. 루트 [1] .Devices.Count()와 그곳에서 일했다. 그러나 원래 프로그램으로 다시 복사 할 때, 나는 그 방법이 아니기 때문에()를 제거해야했습니다.

0

좋아, 이제는 내가 원하는 정보를 멋지고 깔끔하게 가져 왔습니다. 내 프로그램의 한 부분은 구조의 모든 정보를 사용하여 사용자 인터페이스를 작성합니다. 프로그램의 다른 부분은 버튼 중 하나를 누르거나 슬리 어를 바꾼 경우 수행 할 작업을 결정해야합니다. 이 후자 부분은 자동으로 세 가지 정보를 얻습니다.이 작업을 수행하는 코드는 변경할 수 없습니다. 내가 얻는 정보는 "Parameter"클래스의 "RootName", "DeviceName"및 "Number"입니다.

그래서 내가해야 할 일은 matchin RootName을 검색하고 일치하는 DeviceName에서 "PUTCMD"의 DeviceNames 문자열을 가져 와서 내가 얻은 번호에 해당하는 매개 변수 이름을 추가하는 것입니다.

이렇게하는 스마트 방법이 있습니까? 올바른 루트 아래에서 올바른 장치를 찾은 다음 데이터를 가져와 내 전송 문자열을 생성하십시오.

올바른 방향으로 도움을 청합니다.

관련 문제