我如何通过 VB.net 在我的 XML 中构建命名空间 xmlns、xmlns:xsi 和架构 xsi:schemalocaton?

How do i build namespaces xmlns, xmlns:xsi, and schema xsi:schemalocaton in my XML via VB.net?

我需要复制一个 xml header:

<XDataFeed 
xmlns="http://foo.com/namespace" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" .
xsi:schemaLocation="http://foo.com/namespace C:\fooXSD.XML">

用我的代码:

'Export the object to XML
                Dim writer As New XmlSerializer(DataFeed.GetType)
                Dim ns As New XmlSerializerNamespaces()
                ns.Add("xmlns", "http://foo.com/namespace")
                ns.Add("xsi", "http://www.w3.org/2001/XMLSchema-instance")
                Dim file As New System.IO.StreamWriter("C:\foo.xml")
                writer.Serialize(file, DataFeed, ns)
                file.Close()

我遇到了 2 个问题:

  1. 当我尝试为 foo.com 添加不带前缀的名称空间时,它会删除所有名称空间。我上面的代码将 foo.com 的命名空间添加为:

    xmlns:xmlns="http://foo.com/namespace"

这是不正确的。我如何简单地添加没有前缀的命名空间?

  1. 我搜索了一个小时,试图弄清楚如何将属性 "xsi:schemaLocation..." 附加到我的 xml,尽管我发现的每个示例都使用 c# 中的类型,或对已声明的 xml 文档不适用于我的 VB.Net XmlSerializer 方法。我如何通过上面的 XmlSerializer 代码将 schemaLocation 属性附加到我的 xml?

非常感谢您的帮助。我需要让我的 XML 通过 XSD 验证才能获得批准,这是阻碍我前进的最后一步。

只能自己做。

不要将您的命名空间添加到 XmlSerializerNamespaces。相反,只需将它放在您的父对象上。这应该使它没有前缀而只是 xmlns="http://...".

<XmlRoot(Namespace:="http://foo.com/namespace")>
Public Class XDataFeed
    '...
End Class

如果出于某种原因,它会添加一个虚拟前缀,例如 d1p1,请使用 string.Empty 作为您的前缀,然后继续将您的命名空间添加到 XmlSerializerNamespaces.

为了显示 SchemaLocation,您可以创建一个虚拟 属性 并相应地标记它:

<XmlAttribute("schemaLocation", NameSpace:=XmlSchema.InstanceNamespace)>
Public Property SchemaLocation As String
    Get
        Return "http://foo.com/namespace C:\fooXSD.XML"
    End Get
    Set(value As String)
        'Ignore... pureley needed for serialization.
    End Set
End Property

您已经在 xsi 命名空间中添加,因此如果您继续这样做,它应该可以正常工作。只需取出您的 xmlns 命名空间。

最后你应该得到这样的 class:

<XmlRoot(Namespace:="http://foo.com/namespace")>
Public Class XDataFeed

    <XmlAttribute("schemaLocation", NameSpace:=XmlSchema.InstanceNamespace)>
    Public Property SchemaLocation As String
        Get
            Return "http://foo.com/namespace C:\fooXSD.XML"
        End Get
        Set(value As String)
            'Ignore... pureley needed for serialization.
        End Set
    End Property

End Class

这个有效:

<XmlAttribute("schemaLocation", Namespace:=**System.Xml.Schema.XmlSchema.InstanceNamespace**)>
Public Property SchemaLocation As String
    Get
        Return "*maValeurXsischemaLocation*"
    End Get
    Set(value As String)
        'Ignore... pureley needed for serialization.
    End Set
End Property