7

我正在处理数据实例的一些 XML 表示。我正在使用 .NET 序列化反序列化对象,但是我的灵魂中的某些东西因必须编写类来表示 XML 而感到不安……下面是我想做的事情,但我不知道语法是否正确甚至是可能的:

考虑以下:

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

xmlObject.SomePropertyDefinedInTheXML = SomeFunction()

对此方法有什么建议吗?

4

4 回答 4

4

去获取xsd.exe。它将根据您的模式定义创建适当的 XML 序列化类。自动地!

于 2010-02-12T17:55:33.020 回答
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);

以下是SerializerDeserializer类的链接。

如果您有 WSDL 或 XSD,您可以使用 wsdl.exe(或在 VS.NET 中添加服务引用)或 xsd.exe 为您生成 dto 类,如 @DavidSchmitt 建议的那样。

或者,如果没有可用的 XSD,那么我建议您查看Xlinq,以了解另一种解析 XML 的简单方法。

于 2010-02-12T18:08:11.920 回答
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属性始终返回一个字符串。

于 2010-02-15T17:29:04.790 回答
0

您通过鸭子类型提出的要求是松散类型,而.net 绝对是静态类型,至少在 3.5 版本之前是这样。

如果你遵循这些类型的道路,并输入 liberation 你有: classical frameworks => prototyping frameworks=> duck typing

在 js 中,显然你几乎可以实现这一切,但在 c# 或 vb.net 中,当涉及到类型时,你会发现自己处于古典和官僚主义之中。

您可以在运行时松散地创建这些类型,但它会消耗处理时间,并且在它进入内存之前,它可能真的很慢。

如果绝对有必要,您有两条路径(涉及反射):

  • 您可以使用属性信息创建那些可能是属性持有者的类,然后创建一个类型并插入其中。您将必须创建一个放置它们的位置,例如组件或模块。除非您为此制定行动计划,并且担心它可能暗示的安全问题,否则您当前的方法将几乎没有支持或没有支持。

  • 您可以遵循最痛苦的路径并使用反射.emit,在 CLR 中直接创建您的类型,这可以为您带来很多很多好处。但是,这样做可以证明自己很痛苦。

如果您找到方法,请,我很想听听,因为鸭子打字很棒。独立勇敢的人是值得称赞的。

祝你好运

于 2010-02-12T19:16:07.997 回答