我正在处理数据实例的一些XML表示。我正在使用.NET序列化对对象进行反序列化,但是我的灵魂中的某些内容因为必须编写类来表示XML而受到干扰...以下是我喜欢做的但我不知道语法是否如此甚至可能:
请考虑以下事项:
dim xmlObject = SomeXMLFunction() 'where some function returns an object/string representation of xml...
xmlObject.SomePropertyDefinedInTheXML = SomeFunction()
有关此方法的任何建议吗?
答案 0 :(得分:4)
去吧xsd.exe。它将从您的模式定义中创建适当的XML序列化类。自动!
答案 1 :(得分:3)
如果你控制XML的定义(即XSD),那么实际编写代表XML的类是一个好主意(这些被称为DTO)。它为您提供了一个强类型类来编写代码,并且您可以免费进行反序列化,而无需自己进行手动,容易出错的xml解析。如果是这种情况,首先编写类,例如
[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);
以下是Serializer和Deserializer类的链接。
如果您有WSDL或XSD,可以使用wsdl.exe(或VS.NET中的Add Service Reference)或xsd.exe为@DavidSchmitt建议为您生成dto类。
或者,如果没有可用的XSD,我建议您查看XLinq以获得另一种解析XML的简单方法。
答案 2 :(得分: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
属性始终返回一个字符串。
答案 3 :(得分:0)
你通过鸭子打字要求的是一个松散的打字,.net绝对是静态打字,至少在3.5版本之前。
如果您遵循这些类型的路径,并键入解放,您:
classical frameworks
=&gt; prototyping frameworks
=&gt; duck typing
。
在js中,显然你几乎可以实现所有这一切,但是在c#或vb.net中,当你与类型相关时,你会发现自己处于古典和官僚之中。
您可以在运行时松散地创建这些类型,但它会占用处理时间,直到它在内存中,它可能会非常慢。
如果必要的话,你有两条路径(涉及反思):
您可以使用属性信息创建这些类(可能是属性持有者),然后创建一个类型并插入其中。您必须创建一个放置它们的位置,如装配或模块。你不会得到现有方法的支持或支持,除非你在行动计划中考虑,并担心它可能带来的安全问题。
您可以按照最痛苦的路径并使用reflection.emit,在CLR中直接创建类型,这可以为您提供许多优点。尽管如此,它可以证明自己很痛苦。
如果你找到方法,请,我很想听听它,因为鸭子打字很棒。必须赞扬独立勇敢的人。
祝你好运