c#
  • xml
  • web-services
  • wcf
  • 2016-07-14 2 views 0 likes 
    0

    XML을 C# 객체로 비 직렬화하려고합니다. 내 클래스가 그대로객체에 직렬화 해제

    <StaffingOrder xmlns='StaffinfOrderNamespace' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
        <OrderId idOwner="VMSAccess"> 
         <IdValue name='RequisitionID'>1</IdValue> 
         <IdValue name='KellyBranch'>3319</IdValue> 
        </OrderId> 
    </StaffingOrder> 
    

    :

    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] 
    [XmlRoot("StaffingOrder")] 
    public class OrderId 
    { 
    
        [XmlElement(ElementName = "RequisitionID")] 
        public int RequisitionID { get; set; } 
    
        [XmlElement(ElementName = "KellyBranch")] 
        public int KellyBranch { get; set; } 
    } 
    

    내 WCF 서비스 계약을있는 그대로 : 나는 같은 역 직렬화하려고

    [OperationContract] 
    [WebInvoke(Method = "POST", UriTemplate = "UploadOrderDocument", 
          RequestFormat = WebMessageFormat.Xml, 
          ResponseFormat = WebMessageFormat.Xml, 
          BodyStyle = WebMessageBodyStyle.Bare)] 
    [XmlSerializerFormat] 
    OrderId UploadOrderDocument(string hrXML); 
    

    :로

    내 XML은

    public OrderId UploadOrderDocument(string hrXMLString) 
    { 
    
        OrderId orderId = new OrderId(); 
    
        using (StringReader sr = new StringReader(hrXMLString)) 
        { 
         XmlSerializer xs = new XmlSerializer(typeof(OrderId)); 
         orderId = (OrderId)xs.Deserialize(sr); 
         var temp = orderId.RequisitionID; 
        } 
    
        return orderId; 
    } 
    

    deserialize하는 동안 오류가 발생하지 않지만 RequisitionID 값을 가져 오지 못합니다.

    +0

    여러 요소 속성이있는 XML 파일의 비 직렬화 - 특성이 비 직렬화되지 않음] (http://stackoverflow.com/questions/14245846/deserializing-xml-file-with-multiple-element-attributes-attributes-are) -not-des) – niksofteng

    답변

    3

    당신의 클래스는 당신이 비 직렬화하려는 XML과별로 유사하지 않은 것처럼 보입니다. 당신은 당신이 만든 클래스에서 XML을 생성한다면, 그것은 다음과 같이 보일 것입니다 :

    <StaffingOrder> 
        <RequisitionID>1</RequisitionID> 
        <KellyBranch>3319</KellyBranch> 
    </StaffingOrder> 
    

    을 실제로 XML 구조 표현 클래스입니다 원하는 :

    [XmlRoot(Namespace = "StaffinfOrderNamespace")] 
    public class StaffingOrder 
    {  
        public OrderId OrderId { get; set; }  
    } 
    
    public class OrderId 
    { 
        [XmlAttribute("idOwner")] 
        public string IdOwner { get; set; } 
    
        [XmlElement("IdValue")] 
        public List<IdValue> IdValues { get; set; } 
    } 
    
    public class IdValue 
    { 
        [XmlAttribute("name")] 
        public string Name { get; set; } 
    
        [XmlText] 
        public int Value { get; set; } 
    } 
    

    this fiddle 참조 실용적인 데모.

    0

    는 당신이 실제로있는 것은

    public class OrderId 
    { 
        [XmlElement] 
        public IEnumberable<int> IdValue { get; set; } 
    } 
    

    ElementName을 name 속성에 대해 작동하지 않습니다이 개체입니다.

    0

    이 작업에는 두 가지 방법이 있습니다. 하나는 Charles에서 언급 한 클래스를 변경하고, 다른 하나는 IXmlSerializable을 구현하고 사용자 고유의 직렬화 논리를 구현하는 것입니다.

    IXmlSerializable의 추가 장점은 XML 구조가 어딘가에서 변경되면 클래스의 구조를 변경할 필요없이 해당 구현을 변경할 수 있다는 것입니다.

    +0

    어떤 예제 든 도와 주시겠습니까 – Rahul

    +0

    여기 코드 프로젝트에 관한 훌륭한 기사가 있습니다 : http://www.codeproject.com/Articles/43237/How-to-Implement-IXmlSerializable-Correctly –

    관련 문제