我需要复制一个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()
并且我遇到了两个问题:
当我尝试添加没有foo.com前缀的命名空间时,它会删除所有命名空间。我上面的代码将foo.com的命名空间添加为:
的xmlns:的xmlns =&#34; HTTP://foo.com/namespace"
这是不正确的。如何在没有前缀的情况下添加命名空间?
我非常感谢你的帮助。我需要让我的XML通过XSD验证才能获得批准,这是最后一件阻碍我的方式。
答案 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