2011-03-01 4 views
1

XDocument을 사용하여 xml 파일을 구문 분석하는 일부 코드가 있습니다.Xml에서 Object가 아닌 String으로 값을 검색하는 방법은 무엇입니까?

값을 올바르게 검색하지만 xml에 저장 한 값 중 일부는 Object입니다. 나는 XML에서 이러한 값을 읽을 때, 그들은 내가 객체로 캐스팅에도 불구하고, string 값으로 제공 :

XDocument doc = XDocument.Load (file); 
XElement xe = doc.Element ("EffectFile"); 

xe.Elements ("Options").Any () 
    ? xe.Elements ("Options").Select (
     o => o.Elements ("Option").Select (
      n => (object) n.Value).First ()) 
    : null)) 

는 XML에 나타나는 값 :

... 
<Option>88</Option> 
... 

"88" 온다 대신 Object 88입니다.

나는 내가 Objectstring 캐스팅 할 때, 그것은 여전히 ​​string 될 것이라고 이해하지만, 그것은에게 (즉 수 있습니다 무엇이든) 실제 값의 Object 아니지만 string을 만들 수있는 방법이?

int intValue = (int) value; 

답변

4

XML 문자열을 보관 유지하는 일을해야한다 - 당신이, 당신이 당신의 XML의 어떤 장소를 구문 분석 할 수 있습니다에두고있는 것을 확신하는 경우 Tony Casale이 ints로 쓴 것처럼 형식을 수정해야합니다.

또는 어떤 장소에 개체가있을 수있는 경우 XML 읽기 코드에 지정하는 특성을 추가해야합니다.이 노드를 읽은 후이 노드를 변경해야합니다. 이 같은

:

<option> 
    <name>some name</name> 
    <value type="int">123</value> 
</option> 
<option> 
    <name>some other name</name> 
    <value type="string">abcdefg</value> 
</option> 

그런 다음 코드에서 당신은 값 태그에서 각 문자열로 변환 유형을 확인해야합니다.

+0

감사합니다. 그러나 type = ""유일한 방법을 사용하고 있습니까? 나는 단지 객체의 값을 객체의 값이 아니라 객체의 값으로 저장하려고합니다. 그래서 이것을 위해 XML에 유형을 저장해야합니까? "자동"xml serialization을 수행 할 때 과 같은 것을 사용하여 serializer를 발견했습니다. 어쩌면 그렇게 할 수 있을까요? –

+0

Xml은 텍스트 파일로 디스크에 쓸 수 있으므로 형식을 지정하지 않으면 이전에 어떤 형식인지 알기 위해 디스크에서 프로그램을 읽는 방법이 없습니다. 속성 일 필요는 없습니다. value 요소에 중첩 된 다른 요소 일 수도 있고 다른 이름을 가진 속성 일 수도 있지만 판독기에 대한 힌트가 필요합니다. – ajuc

+0

@ Joan - XML에서 읽으면 항상 문자열이됩니다. –

3

예 :이 다르기 때문에 내 options 값이 object[]으로 저장 사용할 때

, 나중에

object value = 88; 
object value = (object) "88"; 

? :하지, 난 할 수 있도록하려면 그것들은 다르다. 당신은 할 필요가 :

int intValue = int.Parse("88");

는 소스 유형이 무엇인지 모른다면, 당신은 또한 할 수있다 :이 경우, int 아무것도 변환합니다

int intValue = Convert.ToInt32(someObject);

양철통.

+0

고마워요.하지만 int 값을 사용할 수 있도록 XML에서 값을 가져올 수 있기를 바랍니다. intValue = (int) value; 그렇지 않으면 저장/불러 오기를 통해 동일한 값을 유지할 수 없습니다. 즉, 전에는 int이고 이전에는 문자열을 사용하고 있습니다. –

+0

'value'가 이미 int가 아니라면'(int) value'를 사용할 수 없습니다. 만약 당신이 제대로 이해한다면'Convert.ToInt32()'메소드가 도움이 될 것입니다. –

+0

@ 조안 : 파싱이나 변환 후'object []'에'intValue'를 저장하면 제대로 작동합니다. –

2

XElement를 명시 적 INT 캐스트에 대한 연산자 오버로드를 가지고, 그래서 당신은 아마

XDocument doc = XDocument.Load (file); 
XElement xe = doc.Element ("EffectFile"); 

xe.Elements ("Options").Any () 
    ? xe.Elements ("Options").Select (
     o => o.Elements ("Option").Select (
      n => (int) n).First ()) 
    : null)) 
+0

고마워,하지만 내가 가지고있는 값은 모든 유형이 될 수 있으므로 코드에서 object [] 값으로 사용할 수 있습니다. –

+0

@ joan-venge 사용자는 파일을 보면서 그 값이 int인지 아닌지를 알아야합니다. XML은 숫자로 사용할지 여부를 결정하기 위해 형식으로 표시해야하는 모든 문자열입니다. – jbtule

2

XML은 텍스트입니다 ... 일반적으로 노드 값을 텍스트로 반환합니다. jbtule은 명시 적 캐스트 (자세한 내용은 http://msdn.microsoft.com/en-us/library/bb348319.aspx 참조)를 사용할 수 있다고 말했습니다.

원시 XML을 읽는 대신 XML 직렬화를 사용할 수도 있습니다.

관련 문제