Jag får en xml fil från ett system som jag tänkte läsa in i en klass. Det finns olika slags whitespace i XML. Filen är validerat mot ett schema enligt följande: Lösningen blev så här: Ok.. du kanske kunde löst den via XmlTextReader annars:Deserialize enum
(Använder .Net serialization)
Ett element i filen är en enumoch jag får det inte att fungera eftersom xml filen innehåller linefeed
dvs den ser ut så här:
<minenum>
enumvalue
</minenum>
Det som händer är att jag får felmeddelandet att "\nenumvalue\n" inte ingår i enumen.
koden för att läsa in ser ut så här:
using (TextReader tr = new StreamReader(@"minxmlfil.xml")) {
XmlSerializer serializer = new XmlSerializer(typeof(minklass));
x = (minklass)serializer.Deserialize(tr);
}
Hittar inget attribut eller något som styr hur "whitespace" hanteras vid serialisering
Schemat jag använder för att generera serialiseringen har inställt att ta bort whitespace.Sv: Deserialize enum
Significant och insignificant. Insignificant whitespace är de radbryt, tab:ar eller mellanslag som används för att formattera XML så att det blir mer lättläst för en människa. Alltså de tecken som ligger utanför elementinnehåll. Det är sådant whitespace som brukar avses om whitespace kan/får strippas bort. <b>Significant</b> whitespace - som i ditt fall - är sådana tecken som finns i element och det vore ju rent felaktigt av en XML-processor att strippa dem. Om datatypen är obestämd eller xsd:string är ju radbryt en helt normal teckensekvens som man kanske vill lagra i ett XML-element.
Det här löser inte ditt problem men förklarar varför det sannolikt (och förhoppningsvis) inte finns en String.Trim() inbyggt i Deserialize().
Den optimala lösningen vore ju att de som skapade filen själva validerade mot ett schema och att de valde datatypen xsd:enumeration för detta fält. Då skulle du garanterat få en fil som du kan Deserialisera till en förutsägbar Enum.
Om du inte kan få igenom detta skulle jag föreslå att du testar att skriva en egen Deserializer klass som ärver från XmlSerializer som tvättar bort oönskade whitespace i strängen med Trim() t.ex.Sv:Deserialize enum
<xs:element name="minenum">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:whiteSpace value="collapse"/>
<xs:enumeration value="enum1"/>
<xs:enumeration value="enum2"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
Problemet är att det inte verkar finnas något serialization-attribut som styr hur whitespace ska hanteras.
Jag tror helt enkelt att jag lägger in ett filter som tar bort alla \n i filen innan jag deserialiserar.Sv: Deserialize enum
using (StreamReader sr = new StreamReader(@"filename.xml")
using (StringReader str = new StringReader(sr.ReadToEnd().Replace("\n","")))
return new XmlSerializer(typeof(mytype)).Deserialize(str);
Sv:Deserialize enum
http://msdn.microsoft.com/en-us/library/6f00zs65(VS.71).aspx