2016-06-02 2 views
0

처음 포스터, 오랜 시간 독자. 필자는 XML 가져 오기 (또 다른 첫 번째)를 작성했으며 충돌 할 수있는 방법과 접근 방식에서 길을 잃었습니다.속성 값을 기준으로 XML로드.

... 
<TableRow> 
    <Field Name="DeliveryNote" Type="etc..">Text</Field> 
    <Field Name="OrderNumber" Type="etc..">Text</Field> 
    and so on... 
</TableRow> 
... 

내가 (모든 요구되지 않음) 분야의 대부분의 속성과 객체를 가지고 있고, 나는 현재 속성을 채우는 해요 :

는 는

내가 가져 오기에 노력하고있어 XML은 다음과 같이 대략 보인다 과 같이에서 구축 관련하여 XElement를 발생합니다 생성자에서 :

public Order(XElement p_tableRow) 
{ 
foreach (XElement field in p_TableRow.Elements("Field")) 
    { 
     switch (field.Attribute("Name").Value) 
     { 
      case "DeliveryNote": 
       ReasonCode = field.Value; 
       break; 
      case "OrderNumber": 
       OrderID = field.Value; 
       break; 
      case "ProductCode": 
       CustProductCode = field.Value; 
       break; 
      case "Quantity": 
       QuantityCharged = field.Value; 
       break; 
... 

내 문제는이 일을 얻는 동안, 그것은 굉장히 투박 (못생긴) 보인다는 것이다. 확실히 더 좋은 방법이 있습니까?

투영으로이를 수행하는 방법에 대해 머리를 쓰려고했지만 노드의 속성을 기반으로 데이터의 대상을 결정하는 예제를 찾지 못했습니다.

내가 사용은 .NET 3.5

모든 포인터가 대량으로 감상 할 수있다.

당신은 약간의 매핑을하고 반사에 의존 할 수
+0

Xml 직렬화를 사용해 보셨습니까? http://stackoverflow.com/questions/16831317/c-sharp-xml-deserialization-xmlatt –

+0

나는 코드를 좋아합니다. 이해하고 수정하기가 쉽습니다. 피벗 테이블을 만들고 피벗 테이블 코드가 복잡 할 수 있습니다. 코드를 가능한 한 간단하게 유지하고 단축키를 찾지 않을 것입니다. – jdweng

+1

@ Sam.C : 기술적으로 (필자가 이해하는 한) 직렬화가 올바른 방법임을 확신하지 못합니다. 키/값 쌍. – AshLewis

답변

1

: 다시 Order() 방법을 업데이트하기 위해 다음

public Order(XElement p_tableRow) 
{ 
    foreach (XElement field in p_TableRow.Elements("Field")) 
    { 
     string propName = _mapping[field.Attribute("Name").Value]; 
     PropertyInfo propInfo = GetType().GetProperty(propName); 
     propInfo.SetValue(this, field.Value); 
    } 
} 

당신이 결코 것 :

private Dictionary<string, string> _mapping = new Dictionary<string, string> 
{ 
    { "DeliveryNote", "ReasonCode" }, 
    { "OrderNumber", "OrderID" }, 
    { "ProductCode", "CustProductCode" }, 
    { "Quantity",  "QuantityCharged" } 
}; 

그런 다음 가져 오기 그냥 같이 보일 것이다 매핑에 새로운 속성/속성 쌍을 추가하기 만하면됩니다.

+0

나는 여기에 확장 성을 좋아한다. 훌륭한 대답이다. XPath와 같은 것을 사용하여 동일한 사전 사전 접근 방식을 달성 할 수 있습니까? 내가 물어 보는 이유는 루트 아래에서 다양한 요소를 끌어 당기는 동일한 프로젝트에 다른 클래스가 있다는 것입니다. – AshLewis

관련 문제