2014-06-24 1 views
1

XML 파일을 구문 분석하기 위해 LINQ 및 XDocument를 사용하고 있습니다. XML의 필드 중 일부는 고정되어 있지 않으며 때때로 이중 또는 문자열 일 수 있습니다. 일반적으로 double이되지만 문자열은 데이터를 사용할 수 없음을 나타냅니다. 예를 들어Nullable에 문제가 있습니다. <T>

는 :

<current_observation> 
    <temp_c>12.1</temp_c> 
    <temp_c>NA</temp_c> 
</current_observation> 

나는 XML 필드에서 읽은 다음 새 객체 인스턴스의 속성을 설정합니다. 이처럼 : 나는 이중에 필드를 구문 분석하는 중 TryParse를 사용하거나이 불가능했던 경우 null로 속성을 설정할 수 있도록 Nullable 유형을 사용하기로 결정

 var data = from i in weatherResponse.Descendants("current_observation") 
        select new CurrentConditions 
        { 
         // Attempt to parse. Set to null if not a double. 
         // This is one of the areas I'm having trouble with. 
         TemperatureC = Utilities.ParseDoubleValue(i.Element("temp_c")) 

         // If I use the following line instead then it works without problem. 
         // But this misses out all of the safe parsing. 
         // TemperatureC = (double)i.Element("temp_c") 
        }; 

. 여기

내가 현장을 시도하고 구문 분석하는 데 사용하고 코드입니다 : 그러나

public static class Utilities 
    { 
     public static double? ParseDoubleValue(object inputValue) 
     { 
      if (inputValue == null) 
       return null; 

      double returnValue; 

      return double.TryParse(inputValue.ToString(), out returnValue) ? returnValue : (double?)null; 
     } 
} 

를, 내가 이렇게하면 때문에 내 코드에서 그 곳이 실제로 제대로 필드를 구문 분석되지 않은 것 같습니다 :

if(currentConditions.TemperatureC.HasValue) 
     Console.WriteLine("Has a value: {0}", currentConditions.TemperatureC.Value); 
    else 
     Console.WriteLine("Not Avaliable."); 

다음 HasValue는 항상 거짓를 반환합니다.

내 질문 : 왜 값을 파싱하려고 시도하는 나의 방법이 작동하지 않습니까? TryParse 및 null 입력 가능 유형을 오해 한 적이 있습니까?

+2

세트 일부 중단 점 및 코드의 상태를 검사 ParseDoubleValue에 대한 –

+0

귀하의 로직은 비트 로터리입니다. 이미 삼항 연산자를 가지고 있기 때문에 처음에는 if 블록이 필요 없으며, null을 명시 적으로'double? '으로 캐스팅 할 필요가 없습니다. –

답변

2

XElement은 다양한 숫자 유형에 대해 explicit type conversions을 정의합니다. 따라서 (double)i.Element("temp_c")이 허용되며 XElementvalue을 내부 데이터 호출 Double.Parse을 통해 double 데이터 형식으로 캐스팅합니다.

object 인수를 Utilities.ParseDoubleValue 메서드에 전달하면 XElement 전체를 전달할 수 있습니다. inputValue.ToString()으로 전화하면 12.1이 아니라, <temp_c>12.1</temp_c>, the indented XML value for the node이됩니다. 그리고 double.TryParse("<temp_c>12.1</temp_c>")은 물론 실패합니다.

이 오류는 XElement 자체가 아닌 XElement의 문자열 값으로이 메서드를 제공하려는 경우가 대부분입니다. , 방어 수단으로, 당신은 당신의 방법에 대한 메소드 서명을 재고 할 수 있습니다

TemperatureC = Utilities.ParseDoubleValue(i.Element("temp_c")) 

둘째

TemperatureC = Utilities.ParseDoubleValue(i.Element("temp_c").Value) 

에 :

public static double? ParseDoubleValue(object inputValue) 

이를이 변화의 간단한 문제입니다 모든 객체를 허용하지만 호출자가 제공하는 문자열을 변환하는 데 궁극적으로 관심이 있습니다. 문자열 만 받아들이도록 변경하면 호출자가 문자열을 제공하고 그렇지 않으면 컴파일 오류가 발생합니다.다양한 지점에서

public static double? ParseDoubleValue(string inputValue) 
+0

감사합니다. 또한 상세한 답변을 통해이를 더 명확하게 이해할 수있었습니다. – user9993

2

i.Element는 값이 아닌 XElement를 반환합니다. 그리고 물론, 이것은 숫자로 해석 될 수 없습니다. i.Element("temp_c").Value

+0

고마워요. – user9993

관련 문제