如何通过VB.net在我的XML中构建名称空间xmlns,xmlns:xsi和schema xsi:schemalocaton?

时间:2015-04-01 17:28:39

标签: xml vb.net serialization namespaces

我需要复制一个xml标题:

<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()

并且我遇到了两个问题:

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

    的xmlns:的xmlns =&#34; HTTP://foo.com/namespace"

  2. 这是不正确的。如何在没有前缀的情况下添加命名空间?

    1. 我搜索了一个小时试图弄清楚如何追加属性&#34; xsi:schemaLocation ...&#34;到我的xml,虽然我找到的每一个例子都使用c#中的类型,或者对声明的xml doc进行操作,这些不适合我的VB.Net XmlSerializer方法。如何通过上面的XmlSerializer代码将schemaLocation属性附加到我的xml?
    2. 我非常感谢你的帮助。我需要让我的XML通过XSD验证才能获得批准,这是最后一件阻碍我的方式。

2 个答案:

答案 0 :(得分:1)

我必须自己做。

不要将您的名称空间添加到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命名空间。

最后你应该得到这样一个类:

<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

答案 1 :(得分:-1)

这有效:

<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