2010-02-12 3 views
7

저는 데이터 인스턴스의 XML 표현과 관련하여 작업하고 있습니다. .NET serialization을 사용하여 객체를 deserialize하고 있지만 내 영혼의 일부는 XML을 나타내는 클래스를 작성해야하므로 방해가됩니다. 아래는 내가하고 싶은 것이지만 구문이 맞는지 이와 approachs에.NET에서 Generics 및 Duck Typing XML?

dim xmlObject = SomeXMLFunction() 'where some function returns an object/string representation of xml... 

xmlObject.SomePropertyDefinedInTheXML = SomeFunction() 

어떤 제안 :

다음과 같은 고려

:도 가능하다?

답변

3

VB.NET 당신은 매우 직관적 인 방법으로 XML 작업을 수행 할 수 있습니다에 행운을 빕니다 :

Sub Serialize() 
    Dim xml = <myData> 
        <someValue><%= someFunction() %></someValue> 
       </myData> 
    xml.Save("somefile.xml") 
End Sub 

Sub Serialize2() ' if you get the XML skeleton as a string 
    Dim xml = XDocument.Parse("<myData><someValue></someValue></myData>") 
    xml.<myData>.<someValue>.Value = "test" 
    xml.Save("somefile.xml") 
End Sub 

Sub Deserialize() 
    Dim xml = XDocument.Load("somefile.xml") 

    Dim value = xml.<myData>.<someValue>.Value 
    ... 
End Sub 

단점 : 당신은 여기에 강력한 입력을하지 않아도; Value 속성은 항상 문자열을 반환합니다.

+0

이것은 정확히 내가 찾고있는 것입니다. – Achilles

+1

아주 좋아, 이제 내 눈이 피가 흘렀고 나는 오늘 밤 잠을 잘 수 없을 것이다. :-) –

4

가서 xsd.exe을 얻으십시오. 스키마 정의에서 적절한 XML 직렬화 클래스를 작성합니다. 자동!

+0

1. 스키마가 없습니다 :-( 2. xml을 직접 구문 분석 할 수있는 유틸리티가 있지만 올바르게는 느껴지지 않습니다. 3. 멋진 대답 +1 – Achilles

+0

하나가 있어야합니다. xsd.exe는 다음과 같이 도와 줄 수 있습니다 : "XML 파일 (.xml 확장자)을 지정하면 Xsd.exe는 파일의 데이터에서 스키마를 추론하고 XSD 스키마를 생성합니다." –

+0

제 질문의 정신은 다음과 같습니다. "this"접근 방식을 사용할 수 없다면이 접근 방식을 사용하겠습니다. – Achilles

3

실제로 XML을 나타내는 클래스를 작성하는 것보다 XML 정의 (예 : XSD)를 제어하는 ​​것이 좋은 아이디어입니다 (DTO라고 함). 그것은 강력한 형식의 클래스를 제공하며 직접 XML을 수동으로 오류 발생하기 쉬운 구문 분석을 수행 할 필요없이 무료로 직렬화를 해제합니다. 이 경우 클래스를 먼저 작성하십시오 (예 : 여기

//You can then [Deserialize][2] it back again with: 
var book = DataContractDeserializer.Instance.Parse<Book>(xml); 

<Book> 
<Name>A</Name> 
<Author>B</Author> 
</Book> 
[DataContract] 
public class Book 
{ 
    [DataMember] 
    public string Name {get;set;} 

    [DataMember] 
    public string Author {get;set;} 
} 
//Then you can use this code to serialize 
var xml = DataContractSerializer.Instance.SerializeToString(
    new Book {Name="A", Artist="B"}); 

//which will give you something like: 

SerializerDeserializer 클래스에 대한 링크입니다.

WSDL 또는 XSD가있는 경우 @DavidSchmitt가 제안한대로 wsdl.exe (또는 VS.NET의 서비스 참조 추가) 또는 xsd.exe를 사용하여 dto 클래스를 생성 할 수 있습니다.

또는 사용할 수있는 XSD가없는 경우 XLinq을보고 XML을 구문 분석하는 또 다른 쉬운 방법을 살펴 보는 것이 좋습니다.

0

오리 타이핑으로 묻는 것은 느슨한 타이핑이고, .net은 적어도 3.5 버전까지 항상 정적 타이핑입니다.

당신은 그러나 이러한 종류의 경로를 따라, 그리고 당신이 해방 입력하면 : classical frameworks =>prototyping frameworks =>duck typing합니다.

js에서는 분명히 거의 모든 것을 얻을 수 있지만 C# 또는 vb.net에서는 유형과 관련하여 고전적이고 관료적 인 모습을 보게됩니다.

런타임에 이러한 유형을 느슨하게 만들 수 있지만 처리 시간이 오래 걸리며 메모리에 저장 될 때까지 처리 속도가 느려질 수 있습니다.

은 모든 필요한 의미입니다 경우 두 가지 경로 (포함하는 반사)가 :

  • 당신은 속성 정보를 사용하여 속성 홀더 아마 될 것입니다 이러한 클래스를 생성하고 생성 할 수 있습니다 유형을 입력하고 삽입하십시오. 어셈블리 나 모듈과 같이 배치 할 장소를 만들어야합니다. 당신은 그 행동 계획에 대해 생각하지 않는 한 현재의 방법으로는 거의 지원을하지 않거나 아무런 지원도하지 않을 것이며 그것이 암시 할 수있는 보안 문제에 대해 걱정할 것입니다.

  • 가장 고통스러운 경로를 따르고 reflection.emit을 사용하여 CLR에서 유형을 직선적으로 만들면 많은 이점을 얻을 수 있습니다. 그것은 고통을 스스로 증명할 수 있습니다.

오리를 입력하는 것이 좋기 때문에 길을 찾으면 알려주세요. 독립적이고 용감한 사람들은 칭찬을 받아야합니다.

당신이