[C#] LINQ To XML lägger till mellanslag?

Permalänk

[C#] LINQ To XML lägger till mellanslag?

Hej,

Håller på och ska skriva en XML-parser till jobbet. Vi har redan en men den ska fasas ut så jag skriver om det till C# och vill få samma resultat. Mitt program loopar igenom hela tiden den nuvarandes resultat och jämför med mitt. Det skumma är följande:

Vissa rader lägger mitt program till ett mellanslag mitt i en mening? Sjukt skumt... Xml-taggen ser ut såhär:

<Street>Sjögatan 13 , 2 tr</Street>

Det nuvarande programmet får det till

Sjögatan 13 , 2 tr

men mitt program lägger till ett mellanslag efter kommatecknet?

Sjögatan 13 , 2 tr

Det är enbart denna rad i koden som gör detta:

address.Street = (from c in xmlAddress select (string)c.Element("Street")).FirstOrDefault();

Visa signatur

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase

Permalänk
Medlem

Läser du in en enda rad? Du ska inte ta ut bara gatunamnet enskilt? Kolla att det är ett mellanslag den spottar ut, och inte en misslyckad tabb eller retur.

Det måste finnas en skillnad mellan de rader som fungerar och de rader som inte fungera. Kolla teckenkodning o. dyl.

Permalänk
Citat:

Ursprungligen inskrivet av azoapes
Läser du in en enda rad? Du ska inte ta ut bara gatunamnet enskilt? Kolla att det är ett mellanslag den spottar ut, och inte en misslyckad tabb eller retur.

Det måste finnas en skillnad mellan de rader som fungerar och de rader som inte fungera. Kolla teckenkodning o. dyl.

Jag läser in en massa rader men det där är den enda som är relevant här. Kan heller inte påverka XML-inpuen...

Det är samma fil som jag läser av så enkodningen bör vara samma...

Alltså, på alla rader som ser ut som den noden ovan blir samma, över flera filer. Hur kontrollerar jag ett det är ett mellanslag som slängs in?

Visa signatur

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase

Permalänk
Avstängd

Kan du testa med olika sorters xml-input? Sker det alltid efter ',' eller? För om så är fallet så kan du ju alltid ta bort ett mellanslag 'manuellt' efter att du hämtat strängen.

Permalänk
Medlem

Du skriver "Vissa rader", vilket implicerar att det inte händer på alla rader.
Det du måste ta reda på är vad som skiljer dessa rader åt. Hitta mönstret.

Permalänk
Medlem

Det enklaste är nog att helt enkelt förenkla xml-filen tills du inte får felet längre eller den bara består av Street-taggen.. Då borde du ha ett lätt o litet exempel som du kan visa för oss o vi kan testa med

Det kanske är nån teckenkodningsgrej? din förra parser kanske inte brydde sig om filens encoding på samma sätt som .net-parsern? I vilket fall borde det vara lätt o se vad det är för tecken i filen, om du tagit fram ett minimalt exempel enl mitt första förslag så kan du ju tex läsa filen binärt o printa ut bytesen. Eller bra ta in en den som en sträng o printa varje tecken som en int, det är iaf enkelt och se om något ser lurt ut då.

Nånting måste det iaf vara i xml-filen, testar man med exemplet du skrivit här i tråden funkar det ju precis som det ska..

Visa signatur

AK47s for everyone! - Angry mob
Since NaN /= NaN, I think, we should decipher 'NaN' as 'Not a NaN' - Miguel Mitrofanov
(Varför är människan så benägen att tro på Gud?) Antagligen har det lönat sig och evolutionen har drivit fram sådana hjärnor. - Anon

Permalänk
Citat:

Ursprungligen inskrivet av Pylons
Kan du testa med olika sorters xml-input? Sker det alltid efter ',' eller? För om så är fallet så kan du ju alltid ta bort ett mellanslag 'manuellt' efter att du hämtat strängen.

Tror att det alltid sker med ','... Det är orderdata och antar att de oftast inte innehåller ',' förutom på gatuadressen när man har en trappa...

Citat:

Ursprungligen inskrivet av azoapes
Du skriver "Vissa rader", vilket implicerar att det inte händer på alla rader.
Det du måste ta reda på är vad som skiljer dessa rader åt. Hitta mönstret.

Dåligt förklarat av mig.. Tror det sker på alla de som har ','... Tror det är de som skiljer...

Citat:

Ursprungligen inskrivet av vb
Det enklaste är nog att helt enkelt förenkla xml-filen tills du inte får felet längre eller den bara består av Street-taggen.. Då borde du ha ett lätt o litet exempel som du kan visa för oss o vi kan testa med

Det kanske är nån teckenkodningsgrej? din förra parser kanske inte brydde sig om filens encoding på samma sätt som .net-parsern? I vilket fall borde det vara lätt o se vad det är för tecken i filen, om du tagit fram ett minimalt exempel enl mitt första förslag så kan du ju tex läsa filen binärt o printa ut bytesen. Eller bra ta in en den som en sträng o printa varje tecken som en int, det är iaf enkelt och se om något ser lurt ut då.

Nånting måste det iaf vara i xml-filen, testar man med exemplet du skrivit här i tråden funkar det ju precis som det ska..

Ska skriva ihop ett litet testprogram utan affärsdata så ska jag tanka upp det här! Ska nog kunna komma åt jobbdatorn hemifrån

Visa signatur

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase

Permalänk

Verkar vara något enkodningen som ni har sagt hela tiden märker jag nu...

I dreamweaver ser den fel ut(dubbla mellanslag), samma i notepad. Men i explorer är det enkelt mellanslag :/

edit:xml-filen! http://www.box.net/shared/o9ds7x18p0

string file = @C:\Users\Kurt\Documents\street.xml; XDocument xmlFile; using (TextReader reader = new StreamReader(file, Encoding.GetEncoding(28591))) { xmlFile = XDocument.Load(reader); } string fel = (string)xmlFile.Descendants("Order").Select(c=>c.Element("Street")).FirstOrDefault(); Console.WriteLine("Result: {0}", fel); if(fel.Contains(" ")) { Console.WriteLine("Den innehåller dubbelmellanslag på plats {0}", fel.IndexOf(" ")); } else { Console.WriteLine("Nu blev det rätt!"); } Console.ReadLine();

Visa signatur

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase

Permalänk

Ingen som har en aning?

Har försökt att läsa in en ström innan och in strömmen definiera att jag ska använda mig av enkodningen som står längst upp i xml-filen och sen utifrån den strömmen skapa ett XDocumenet, som ovan. Har även testat att inte alls skriva enkodningen men får oavsett vad jag gör samma resultat!

Någon som vet hur jag kan se vilken enkodning som IE går på och vilket som notepad går på?

Visa signatur

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase

Permalänk
Medlem

Anledningen till att det blir ett enkelt mellanslag i IE (eller snarare i de flesta webbläsare) är ju att webbläsarna plockar bort överflödiga mellanslag. Om du istället tar "Visa källa" så ser du att det är två mellanslag i webbläsaren också.

Alltså är det antagligen "fel" i ursprungstexten, och inte i din parser. Om du vill få samma funktionalitet som finns i webbläsarna är det bara att byta ut dubbla (eller fler) mellanslag mot enkla.

Permalänk
Citat:

Ursprungligen inskrivet av bjornie
Anledningen till att det blir ett enkelt mellanslag i IE (eller snarare i de flesta webbläsare) är ju att webbläsarna plockar bort överflödiga mellanslag. Om du istället tar "Visa källa" så ser du att det är två mellanslag i webbläsaren också.

Alltså är det antagligen "fel" i ursprungstexten, och inte i din parser. Om du vill få samma funktionalitet som finns i webbläsarna är det bara att byta ut dubbla (eller fler) mellanslag mot enkla.

Hmm, tack!
Bytte raden till detta så funkade det:

address.Street = ((from c in xmlAddress select (string)c.Element("Street")).FirstOrDefault() ?? "").Replace(" ", " ");

Visa signatur

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase