2010-08-20 4 views
3

J'ai essayé de chercher la réponse, mais ne l'ai pas trouvé la bonne façon de l'analyse syntaxique ce morceau de texte:C# Parsing texte

<Hotspot X="-8892.787" Y="-121.9584" Z="82.04719" /> 
<Hotspot X="-8770.094" Y="-109.5561" Z="84.59527" /> 
<Hotspot X="-8755.385" Y="-175.0732" Z="85.12362" /> 
<Hotspot X="-8701.564" Y="-114.794" Z="89.48868" /> 
<Hotspot X="-8667.162" Y="-122.9766" Z="91.87251" /> 
<Hotspot X="-8802.135" Y="-111.0008" Z="82.53865" /> 

Je veux sortie chaque ligne dans:

Ex. X="-8892.787" Y="-121.9584" etc... 
+2

On dirait un fragment XML. Fait-il partie d'un document XML complet avec un en-tête? Si non, peut-il être? Si c'est le cas, utilisez XmlDocument et vos amis pour analyser. –

Répondre

4

Je devine que vous n'êtes pas trop courant sur votre compétences en développement, mais ce n'est pas seulement du texte, il est xml et que vous souhaitez accéder facilement à l'aide de LINQ to XML d'une façon comme ceci:

XDocument myXDoc = XDocument.Parse(string.Format("<?xml version=\"1.0\" encoding=\"utf-8\"?><root>{0}<root>", yourXmlString)); 
foreach (XElement hotspot in myXDoc.Root.Elements()) 
{ 
    Console.WriteLine(string.Format("X=\"{0}\" Y=\"{1}\"", hotspot.Attribute("X").Value, hotspot.Attribute("Y").Value)); 
} 

je lirais sur XML et LINQ to XML à:

http://msdn.microsoft.com/en-us/library/aa286548.aspx

http://msdn.microsoft.com/en-us/library/bb387098.aspx

+0

Juste édité {0} à {0} et son travaillé. Ty – Anden

9

Si vous pouvez traiter cela comme XML, ce serait de loin la meilleure façon, donc, envisager de traiter comme:

<Hotspots> 
    <Hotspot X="-8892.787" Y="-121.9584" Z="82.04719" /> 
    <Hotspot X="-8770.094" Y="-109.5561" Z="84.59527" /> 
    <Hotspot X="-8755.385" Y="-175.0732" Z="85.12362" /> 
    <Hotspot X="-8701.564" Y="-114.794" Z="89.48868" /> 
    <Hotspot X="-8667.162" Y="-122.9766" Z="91.87251" /> 
    <Hotspot X="-8802.135" Y="-111.0008" Z="82.53865" /> 
</Hotspots> 

Et le charger dans un XmlDocument, puis l'analyse comme suit:

var xml = "<Hotspots><Hotspot X=\"-8892.787\" Y=\"-121.9584\" Z=\"82.04719\" /></Hotspots>"; 
XmlDocument doc = new XmlDocument(); 
doc.LoadXml(xml); 

foreach (XmlNode item in doc.SelectNodes("/Hotspots/Hotspot")) 
{ 
    Console.Write(item.Attributes["X"].Value); 
    Console.Write(item.Attributes["Y"].Value); 
    Console.Write(item.Attributes["Z"].Value); 

    // And to get the ouput you're after: 
    Console.Write("X=\"{0}\" Y=\"{1}\" Z=\"{2}\"", 
        item.Attributes["X"].Value, 
        item.Attributes["Y"].Value, 
        item.Attributes["Z"].Value); 
} 

Note: Je l'ai utilisé un exemple réduit à var xml = "..." pour le rendre un peu plus lisible

+3

XmlDocument est si rétro. –

+0

@Steven, vrai, mais cela fonctionne et j'ai écrit beaucoup de code en l'utilisant ainsi il vient à l'esprit d'abord =) – Rob

+0

@Jimmy, je sais comment utiliser LINQ, XDocument et le faire régulièrement. Pas besoin de l'attitude "get with the program" =) PLUS, XmlDocument est plus largement disponible, car XDocument n'est pas disponible avant le 3.5/4. Le PO n'a pas précisé quelle version de .net il ciblait donc le plus petit dénominateur commun est un bien meilleur pari en tant que réponse (puisque XmlDocument est disponible depuis la version 1.0). – Rob

0

En supposant que chaque ligne commence par <Hotspot ...

//Lines are read into (for this example) a string[] called lines 
List<string> valueLines = new List<string>(); 

foreach(string l in lines) 
{ 
    string x; 
    string y; 
    string z; 

    int xStart = l.IndexOf("X"); 
    int yStart = l.IndexOf("Y"); 
    int zStart = l.IndexOf("Z"); 
    int closeTag = l.IndexOf(@"/"); 

    StringBuilder vlBuilder = new StringBuilder(); 

    vlBuilder.Append(l.Substring(xStart, (yStart - xStart - 1)); 
    vlBuilder.Append(l.Substring(yStart, (zStart - yStart - 1)); 
    vlBuilder.Append(l.Substring(zStart, (closeTag - zStart - 1)); 

    valueLines.Add(vlBuilder.ToString()); 
}