我如何通过 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 个问题:
当我尝试为 foo.com 添加不带前缀的名称空间时,它会删除所有名称空间。我上面的代码将 foo.com 的命名空间添加为:
xmlns:xmlns="http://foo.com/namespace"
这是不正确的。我如何简单地添加没有前缀的命名空间?
- 我搜索了一个小时,试图弄清楚如何将属性 "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
我需要复制一个 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 个问题:
当我尝试为 foo.com 添加不带前缀的名称空间时,它会删除所有名称空间。我上面的代码将 foo.com 的命名空间添加为:
xmlns:xmlns="http://foo.com/namespace"
这是不正确的。我如何简单地添加没有前缀的命名空间?
- 我搜索了一个小时,试图弄清楚如何将属性 "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