我在所有相同的模式/结构之后获得了数千个
XML文件.
我实现了IXmlSerializable,因此我自己阅读元素和属性.
我实现了IXmlSerializable,因此我自己阅读元素和属性.
我的问题是这些文件都使用不同的虚假命名空间.这些文件来自其他来源,因此我无法改变:D
另外,对于我来说,有太多的命名空间只是构建一个可能的命名空间数组并将其传递给xmlserializer.
现在,如果我没有指定命名空间,它会抛出[xmlns:ns0 =“http://tempuri.org/abcd.xsd”不是预期的]错误.
我希望能够告诉序列化程序在反序列化我的对象时简单地忽略命名空间并且只需触发ReadXML.或者只是能够告诉它接受任何“http://tempuri.org/”命名空间.
那可能吗?
谢谢!
对的,这是可能的.当您调用XmlSerializer的Deserialize方法时,您可以指定XmlTextReader实例.
This answer by Cheeso on a related C# question显示了如何创建一个忽略XML文件中出现的任何名称空间的XmlTextReader.我冒昧地将他的想法转化为VB,并根据您的要求创建一个简单的概念验证示例:
Imports System.IO Imports System.Text Imports System.Xml Imports System.Xml.Serialization ' Helper class Class NamespaceIgnorantXmlTextReader Inherits XmlTextReader Public Sub New(stream As Stream) MyBase.New(stream) End Sub Public Overrides ReadOnly Property NamespaceURI As String Get Return "" End Get End Property End Class ' Serializable class Public Class ExampleClass Public Property MyProperty As String End Class ' Example Module Module1 Sub Main() Dim testXmlStream = New MemoryStream(Encoding.UTF8.GetBytes( "<ExampleClass xmlns=""http://tempuri.org/SomePhonyNamespace1.xsd"" xmlns:ph2=""http://tempuri.org/SomePhonyNamespace2.xsd""> <ph2:MyProperty>SomeValue</ph2:MyProperty> </ExampleClass>")) Dim serializer As New XmlSerializer(GetType(ExampleClass)) Dim reader As New NamespaceIgnorantXmlTextReader(testXmlStream) Dim example = DirectCast(serializer.Deserialize(reader),ExampleClass) Console.WriteLine(example.MyProperty) ' prints SomeValue End Sub End Module
注意:如果它只是文档的默认命名空间不同(即,各个标签没有不同的命名空间),则使用标准TextXmlReader并将Namespaces属性设置为False就足够了.
Imports System.IO Imports System.Text Imports System.Xml Imports System.Xml.Serialization ' Serializable Class Public Class ExampleClass Public Property MyProperty As String End Class ' Example Module Module1 Sub Main() Dim testXmlStream = New MemoryStream(Encoding.UTF8.GetBytes( "<ExampleClass xmlns=""http://tempuri.org/SomePhonyNamespace1.xsd""> <MyProperty>SomeValue</MyProperty> </ExampleClass>")) Dim serializer As New XmlSerializer(GetType(ExampleClass)) Dim reader As New XmlTextReader(testXmlStream) reader.Namespaces = False Dim example = DirectCast(serializer.Deserialize(reader),ExampleClass) Console.WriteLine(example.MyProperty) ' prints SomeValue End Sub End Module