2014-01-27 3 views
1

XML:Как десериализовать только строку с пространством имен?

<?xml version="1.0" encoding="utf-8"?><string xmlns="http://www.example.com">Message received</string> 

Я предпочитаю десериализации используя метод расширения, как так:

<Extension()> _ 
    Public Sub DeserializeFromXML(ByRef objTarget As Object, ByVal strXML As String) 

     Dim objXMLSerializer As New System.Xml.Serialization.XmlSerializer(objTarget.GetType()) 
     Dim objStringReader As New System.IO.StringReader(strXML) 
     objTarget = objXMLSerializer.Deserialize(objStringReader) 

    End Sub 

Пример:

Dim strExample As String = String.Empty 
strExample.DeserializeFromXML(strXML) 

Это происходит сбой из-за пространства имен (он работает и без него). Я не могу создать новый класс, который наследует от String, потому что он не наследуется (ради использования атрибутов для определения пространства имен). Как я могу десериализовать простую строку XML с пространством имен?

ответ

0

Я сделал аналогичную вещь, но это было сделано с использованием C# .NET.

Посмотрите, подходит ли это для вас.

public static object DeserializeXmlWithNameSpaceToObject(Type ObjectType, string xml) 
    { 
     object result = null; 

     // identify the namespace, without a matching namespace the xml can't be serialized 
     string defaultNameSpace = string.Empty; 
     XmlDocument document = new XmlDocument(); 
     document.Load(new StringReader(xml)); 
     defaultNameSpace = document.DocumentElement.NamespaceURI; 

     // Set the xml reader settings 
     XmlReaderSettings xrs = new XmlReaderSettings(); 
     xrs.CheckCharacters = false; 

     // Deserialize the xml into an object 
     using (StringReader sr = new StringReader(xml)) 
     { 
      using (XmlReader xr = XmlReader.Create(sr, xrs)) 
      { 
       System.Xml.Serialization.XmlSerializer ser = new System.Xml.Serialization.XmlSerializer(ObjectType, defaultNameSpace); 
       result = ser.Deserialize(new StringReader(xml)); 
      } 
     } 

     // return the object 
     return result; 
    } 

использовал online tool преобразовать этот код C# .NET для VB.NET. Вот конвертированный код VB.NET.

Public Shared Function DeserializeXmlWithNameSpaceToObject(ObjectType As Type, xml As String) As Object 
    Dim result As Object = Nothing 

    ' identify the namespace, without a matching namespace the xml can't be serialized 
    Dim defaultNameSpace As String = String.Empty 
    Dim document As New XmlDocument() 
    document.Load(New StringReader(xml)) 
    defaultNameSpace = document.DocumentElement.NamespaceURI 

    ' Set the xml reader settings 
    Dim xrs As New XmlReaderSettings() 
    xrs.CheckCharacters = False 

    ' Deserialize the xml into an object 
    Using sr As New StringReader(xml) 
     Using xr As XmlReader = XmlReader.Create(sr, xrs) 
      Dim ser As New System.Xml.Serialization.XmlSerializer(ObjectType, defaultNameSpace) 
      result = ser.Deserialize(New StringReader(xml)) 
     End Using 
    End Using 

    ' return the object 
    Return result 
End Function 
+0

Спасибо за сообщение. Мне удалось выяснить проблему из этого кода. Такой простой ответ: используйте перегрузку DefaultNamespace Overload в конструкторе Serializer. – N0Alias

Смежные вопросы