代码之家  ›  专栏  ›  技术社区  ›  Fionn

.NET中的XML序列化和架构(C)

  •  1
  • Fionn  · 技术社区  · 16 年前

    下面的问题是关于用于数据交换的.NET类型库的XML序列化/反序列化和架构验证。


    第一个问题,如果我有一个自定义的XML命名空间,请说“ http://mydomain/mynamespace “是否必须添加

    [XmlRoot(Namespace = "http://mydomain/mynamespace")]
    

    去我图书馆的每一个班级。或者有没有一种方法可以将这个名称空间定义为整个程序集的默认名称空间?


    第二个问题,总是添加的名称空间背后是否有原因

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    

    即使没有对任何名称空间的实际引用?我只是觉得它们给生成的XML添加了干扰。是否有一种方法可以删除它们,并在生成的XML中只使用自定义命名空间?


    第三个问题,是否有工具支持模式定义的生成(例如,对于程序集的所有公共[可序列化]类)和针对特定模式的XML验证?

    如果有,您会推荐W3C的XML模式还是RELAXNG?

    3 回复  |  直到 16 年前
        1
  •  3
  •   Marc Gravell    16 年前

    只需添加-“xsi”等就可以在后面的值上支持xsi:nil之类的东西,这是一种众所周知的可为空值的模式。它必须“仅向前”写入流,并且它不知道(当它写入第一个位时)是否需要nil,因此它假定不必要地写入一次比可能多次使用完整命名空间要好。

        2
  •  2
  •   Will    16 年前

    1)只能在类/结构/接口级别(或返回值)设置xmlroot。所以您不能在组装级别上使用它。你要找的是 XmlnsDefinitionAttribute 但我相信只有XamlWriter才使用它。

    2)如果您担心混乱,那么应该避免XML。格式良好的XML充满了混乱。我相信有一些方法可以与序列化程序生成的XML产生冲突,但不能直接与XML序列化程序产生冲突。您对使用 XmlWriter 班级。 Check here for how you can use the XmlWriter to handle namespaces.

    3) XSD.exe 我相信,可以用来为POCO生成模式(我总是用手工编写的;我可能很快就会用它编写大量的内容,tho!).

        3
  •  0
  •   david valentine    16 年前

    工具, -xsd.exe,命令行类似

    xsd /c /n:myNamespace.Schema.v2_0  myschema_v2_0.xsd
    

    我把这个模式放在一个单独的项目中。

    liqudXML 如果有多个模式,或者您希望完全支持模式功能(带偏移的日期时间、正/负小数点),以及跨平台生成,这将非常有用。