.NET XML反序列化忽略名称空间

我在所有相同的模式/结构之后获得了数千个 XML文件.
我实现了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
相关文章
相关标签/搜索