2010-02-12 20 views
7

Tôi đang làm việc với một số biểu diễn XML về các cá thể dữ liệu. Tôi đang deserializing các đối tượng bằng cách sử dụng serialization NET nhưng một cái gì đó trong linh hồn của tôi bị quấy rầy bởi phải viết các lớp để đại diện cho XML ... Dưới đây là những gì tôi muốn làm nhưng tôi không biết nếu cú ​​pháp hoặc nếu nó thậm chí có thể:Generics và Duck-Typing XML trong .NET?

xem xét như sau:

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

xmlObject.SomePropertyDefinedInTheXML = SomeFunction() 

Bất kỳ đề xuất về phương pháp tiếp cận với điều này?

Trả lời

3

VB.NET cho phép bạn làm việc với XML trong một cách khá trực quan:

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 

Nhược điểm: Bạn không cần phải gõ mạnh ở đây; thuộc tính Value luôn trả về một chuỗi.

+0

Đây chính xác là những gì tôi đang tìm kiếm. – Achilles

+1

Rất đẹp, bây giờ mắt tôi chảy máu và tôi sẽ không thể ngủ tối nay. :-) –

4

Đi và nhận xsd.exe. Nó sẽ tạo các lớp tuần tự hóa XML thích hợp từ định nghĩa lược đồ của bạn. Tự động!

+0

1. Tôi không có lược đồ :-( 2. Tôi có tiện ích để phân tích xml bản thân mình nhưng không cảm thấy đúng. 3. Câu trả lời thú vị +1 – Achilles

+0

Bạn nên có một. xsd.exe có thể giúp bạn: "Nếu bạn chỉ định một tệp XML (phần mở rộng .xml), Xsd.exe sẽ nhập một lược đồ từ dữ liệu trong tệp và tạo lược đồ XSD." –

+0

Tôi nghĩ tinh thần của câu hỏi của tôi là để tránh tạo ra các lớp học, câu trả lời của bạn là rất hữu ích mặc dù.Tôi sẽ sử dụng cách tiếp cận này nếu tôi không thể có được "này" cách tiếp cận để làm việc – Achilles

3

Nếu bạn kiểm soát định nghĩa của XML (nghĩa là XSD) hơn là viết các lớp đại diện cho XML là một ý tưởng hay (chúng được gọi là DTO). Nó cung cấp cho bạn một lớp được đánh máy mạnh mẽ để chống lại và bạn nhận được de-serialization miễn phí mà không cần phải thực hiện phân tích cú pháp thủ công, dễ bị lỗi của xml. Nếu đây là trường hợp viết các lớp học đầu tiên, ví dụ:

[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: 
<Book> 
<Name>A</Name> 
<Author>B</Author> 
</Book> 
//You can then [Deserialize][2] it back again with: 
var book = DataContractDeserializer.Instance.Parse<Book>(xml); 

Sau đây là các liên kết đến các SerializerDeserializer lớp.

Nếu bạn có WSDL hoặc XSD, bạn có thể sử dụng wsdl.exe (hoặc Thêm tham chiếu dịch vụ trong VS.NET) hoặc xsd.exe để tạo các lớp dto cho bạn như @DavidSchmitt được đề xuất.

Hoặc nếu không có sẵn XSD thì tôi khuyên bạn nên xem XLinq để biết cách phân tích cú pháp XML dễ dàng hơn.

0

Những gì bạn đang yêu cầu bằng cách gõ gõ là một đánh máy lỏng lẻo, và .net là tất cả có nghĩa là gõ tĩnh, ít nhất là cho đến phiên bản 3.5.

nếu bạn làm theo một con đường của những loại mặc dù, và gõ giải phóng bạn có: classical frameworks =>prototyping frameworks =>duck typing.

Trong js, rõ ràng bạn có thể đạt được gần như tất cả điều này, nhưng trong C# hoặc vb.net, bạn sẽ thấy mình trong một cổ điển và quan liêu, khi liên quan đến các loại.

Bạn có thể tạo các loại đó một cách lỏng lẻo trong thời gian chạy, nhưng nó tiêu tốn thời gian xử lý và cho đến khi nó ở trong bộ nhớ, nó có thể rất chậm.

Nếu đó là bởi tất cả các phương tiện cần thiết, bạn có hai đường dẫn (, liên quan đến phản ánh):

  • Bạn có thể tạo ra những lớp học, mà sẽ có thể là một người giữ tài sản, sử dụng thông tin thuộc tính, và sau đó tạo một loại và chèn vào nó. Bạn sẽ phải tạo ra một nơi để đưa chúng vào, như một hội đồng, hoặc một mô-đun. bạn sẽ có ít sự hỗ trợ hoặc không có sự hỗ trợ từ các phương pháp hiện tại của bạn, trừ khi bạn nghĩ trong một kế hoạch hành động cho điều đó, và lo lắng về các vấn đề an ninh nó có thể ngụ ý.

  • Bạn có thể đi theo con đường đau đớn nhất và sử dụng reflection.emit, để tạo kiểu thẳng của bạn trong CLR, có thể cấp cho bạn nhiều lợi ích. Nó có thể chứng minh bản thân một nỗi đau để làm điều đó mặc dù.

Nếu bạn tìm cách, xin vui lòng, tôi rất muốn nghe về điều đó, vì việc nhập vịt rất tuyệt. Và những người độc lập và dũng cảm phải được ca ngợi.

Chúc may mắn cho bạn