2010-08-20 92 views
3

我試圖尋找答案,但沒有發現解析這個文本塊的正確方法:C#解析文本

<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" /> 

我要輸出每行到:

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

看起來像一個XML片段。它是否是帶有標題的完整XML文檔的一部分?如果沒有,可以嗎?如果是這樣,那麼使用XmlDocument和朋友進行解析。 – 2010-08-20 20:04:33

回答

4

我猜你是不是太目前您開發技巧,但不只是文字,它的XML,你會很容易地使用LINQ訪問到XML的方式,像這樣:

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)); 
} 

我將在對XML和LINQ讀取多達XML:

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

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

+0

剛編輯 {0} {0}及其工作。泰 – Anden 2010-08-20 23:55:50

9

如果您可以將其視爲XML,那麼這將是更好的方式,因此,請考慮將其視爲:

<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> 

並將其加載到XmlDocument,然後解析它,如下所示:

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); 
} 

注:我用的var xml = "..."減少的例子,使其更有點可讀

+3

XmlDocument太復古了。 – 2010-08-20 20:09:05

+0

@Steven,真的,但它工作,我寫了很多代碼,所以它首先想到=) – Rob 2010-08-20 20:09:29

+0

@Jimmy,我知道如何定期使用LINQ,XDocument。不需要「獲得程序」的態度=)PLUS,XmlDocument更廣泛,因爲XDocument在3.5/4之前不可用。 OP沒有指定他們所針對的.net版本,所以最低公分母是一個更好的答案(因爲XmlDocument可以一直回到1.0)。 – Rob 2010-08-20 20:23:06

0

假定每行開始<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()); 
}