C#解析文本

3

我已经尝试搜索答案,但没有找到正确的方法来解析这段文本:

<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 等工具进行解析。 - Bob Kaufman
3个回答

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 = "..."中使用了一个简化示例,以使其更易读。


@Steven,没错,但它能用并且我已经写了很多代码使用它,所以它首先出现在我的脑海中 =) - Rob
@Jimmy,我知道如何使用LINQ、XDocument,并经常这样做。不需要“跟上潮流”的态度 =)此外,XmlDocument更广泛可用,因为XDocument直到3.5/4才可用。OP没有指定他们针对哪个版本的.NET,所以最低公共分母作为答案是更好的选择(因为XmlDocument一直可用于1.0)。 - Rob

4

我猜测您的开发技能可能不是很熟练,但这并不仅仅是文本,它是XML格式的,您可以使用Linq To 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 To XML的内容,可以参考以下链接:
http://msdn.microsoft.com/en-us/library/aa286548.aspx
http://msdn.microsoft.com/en-us/library/bb387098.aspx

刚刚编辑了<root>{0}<root>为<root>{0}</root>,现在可以正常工作了。谢谢。 - Anden

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接