2011-11-23 1 views
1

웹 요청에서 xml 문서를 찾을 수 있습니다 (here).클래스에 XML 요소 구문 분석

[Serializable] 
public class ExchangeRate 
{ 
    [XmlAttribute("ccy")] 
    public string Ccy 
    { get; set; } 

    [XmlAttribute("base_ccy")] 
    public string Base_ccy 
    { get; set; } 

    [XmlAttribute("buy")] 
    public string Buy 
    { get; set; } 

    [XmlAttribute("sale")] 
    public string Sale 
    { get; set; } 
} 
: 내가 수동으로 클래스 환율 검색을 만든

<exchangerate ccy="EUR" base_ccy="UAH" buy="10.81284" sale="10.81284"/> 

이며, 다음과 같습니다

나는 CCY는, base_ccy, 구매 및 판매는 각각 "환율 검색"요소에서 속성의 값을 얻을 필요

이 방법으로 환율 검색 클래스의 인스턴스 (I은 전체의 XML 문서에서 분리했습니다) XML 요소 "환율 검색"을 역 직렬화하려고 :

private ExchangeRate DesereilizeXMLNode(XmlNode node) 
{ 
    XmlSerializer mySerializer = new XmlSerializer(typeof(ExchangeRate)); 
    TextReader reader = new StringReader(node.OuterXml); 

    return (ExchangeRate)mySerializer.Deserialize(reader); 
} 

DesereilizeXMLNode 메서드를 디버깅 할 때 deserialization 메서드를 호출하는 동안 예외가 발생합니다. 예외는 XAMLParseException은 Grid 요소의 첫 번째 줄 (이상한) MainWindow.xaml이며 예외를 호출하기위한 적절한 장소가 아닌 것 같습니다.

질문은 어디에 있습니까? 내가 잘못 들었습니까? 이런 식으로 XML 요소에서 객체 인스턴스를 만들려고 할 때 잘못 되었습니까? 어쩌면 XML 전체 요소를 deserialization하지 않고 XML 요소 만 deserialize하려고 할 때 실수를 범했습니다.

답변

2

deserialize가 작동하려면 XML 파일의 전체 구문에 대해 Serializable을 지정해야합니다! 그래서 XML의 루트 노드에서부터이 노드까지. (나는 당신에게 당신 조회 URL로 예를 들어 줄 수없는 나를 위해 작동하지 않습니다; 501)


편집 :

그럼 다음 수동으로 요소와 그 속성을 발견 할 것이다, 아래 예와 같습니다. XmlDocument로 변환하지 않으면 XmlElements를 개별적으로 비 직렬화 할 수 없지만 다소 과장됩니다.

XmlDocument doc = new XmlDocument(); 
doc.Load("file.xml"); 

XmlNodeList nodes = doc.SelectNodes("/account_order/row/exchangerate"); 
foreach (XmlNode node in nodes) 
{ 
    XmlAttribute ccyAttribute = node.Attributes["ccy"]; 
    //etc... 
} 
+0

xml-response 링크를 업데이트했습니다. 하지만 필자의 목표는 XML 문서 전체를 비 직렬화하는 것이 아니었다. 전체 문서에서 3 줄만 필요합니다. 그래서 필자는 필자가 필요로하는 xml 노드 만 deserialize 할 수 있다고 생각했다. 속성이있는 단일 xml-elment에서 객체를 만드는 다른 옵션이 있습니까? –

+0

속성 값을이 방법으로 얻을 수있는 것 같습니다. 실제로 그것은 비 직렬화가 아니지만 제 경우에는 사용할 필요가 없습니다. 도와 주셔서 감사합니다! –

1

당신은 전체 문서를 역 직렬화 할 것이다 - 나는 쉽게 당신을 위해 mightbe 당신이 XPath를 함께 필요로하는 환율 검색 요소를 찾을 생각합니다. 그런 다음 각 요소의 값을 읽고 ExchangeRate 객체의 속성을 채우는 '수동 디시리얼라이저'를 작성하십시오.

+0

그래, 내가 어떻게 해야할지 알고 있기 때문에, 확실히 쉬울거야 :)하지만 속성이있는 단일 xml 요소에서 객체를 만드는 방법이 있는지 궁금합니다. 전체 XML 문서의 deserialization을 피하고 싶습니다. –