2017-09-23 1 views
0

mit dem folgenden Stück xml-Code:Serialisierung ändert den Attributwert bei der Verwendung von <oder> (‚<' or '>‘)

<SD GID="&lt;empty&gt;" T="2017-07-31T13:37:48Z">&lt;empty&gt;</SD> 

Von einer XSD-Datei i Klassen generiert mit xsd.exe und der entsprechenden Klasse für Deserialisieren/dieses Element Serialisierung ist die folgende:

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.33440")] 
[System.SerializableAttribute()] 
[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.ComponentModel.DesignerCategoryAttribute("code")] 
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://autosar.org/schema/r4.0")] 
public partial class SD { 
    /// <remarks/> 
    [System.Xml.Serialization.XmlAttributeAttribute(DataType = "NMTOKEN")] 
    public string GID; 

    /// <remarks/> 
    [System.Xml.Serialization.XmlAttributeAttribute()] 
    public string S; 

    /// <remarks/> 
    [System.Xml.Serialization.XmlAttributeAttribute()] 
    public string T; 

    /// <remarks/> 
    [System.Xml.Serialization.XmlTextAttribute()] 
    public string Value; 
} 

Da es diese Linie deserialisiert wurde auch auf dem folgenden Bild zu sehen ist, die ‚<‘ und ‚>‘ Zeichen richtig decodiert wurden: Quickwatch

Ich möchte nur die Serialisierung zurück, ohne den Inhalt zu ändern, aber diese Linie Linie auf die folgende Art und Weise übersetzt zurück:

<SD GID="_x003C_empty_x003E_" T="2017-07-31T13:37:48Z">&lt;empty&gt;</SD> 

So im Wertfeld gibt es die richtige Zeichenfolge, nach der XML-Standard, aber im GID-Attribut werden die '<' und '>' nicht richtig übersetzt.

Der Hauptcode ist sehr einfach:

namespace MyXMLHandler 
{ 
    using System; 
    using System.IO; 
    using System.Linq; 
    using System.Text; 
    using System.Xml; 
    using System.Xml.Serialization; 

    internal class Program 
    { 
     private static void Main(string[] args) 
     { 
      MyType a = DeserializeObject(
       @"source.arxml"); 
      SerializeObject(
       @"source_SERIALIZED.arxml", 
       a); 
     } 

     private static MyType DeserializeObject(string filename) 
     { 
      var serializer = new XmlSerializer(typeof(MyType)); 
      XmlReaderSettings xmlReaderSettings = new XmlReaderSettings(); 
      StreamReader reader = new StreamReader(filename, Encoding.UTF8); 
      MyType i; 

      i = (MyType)serializer.Deserialize(reader); 

      return i; 
     } 

     private static void SerializeObject(string filename, MyType i) 
     { 
      var serializer = new XmlSerializer(typeof(MyType)); 
      Stream fs = new FileStream(filename, FileMode.Create); 
      var settings = new XmlWriterSettings(); 
      settings.Indent = true; 
      settings.IndentChars = " "; 
      settings.Encoding = Encoding.UTF8; 
      var writer = XmlWriter.Create(fs, settings); 

      serializer.Serialize(writer, i); 

      writer.Close(); 

     } 
    } 
} 

Was ist der Grund für die falsche Übersetzung dieser charachters im Attribut sein kann?

+0

Nein, es ist nicht markiert. –

+0

Wenn Sie 'DataType =" NMTOKEN "' entfernen, wird das Problem gelöst. –

Antwort

1

Ein NMTOKEN kann < oder > nicht gültig enthalten (auch wenn diese als Zeichenreferenzen maskiert sind). Daher hat der Serializer eine eigene Methode gefunden, den Attributwert in einen gültigen NMTOKEN zu konvertieren.

+0

Perfekte Lösung! Danke vielmals! ;) –

Verwandte Themen