在C#中解析字符串

4
假设有一个如下所示的xml文件:
<Instances>
  <Bits = "16" XCoord = "64" YCoord = "64" ZCoord = "64" FileType="jpeg" Location="C:\Series1\Image1.jpg" ImageNumber = "1"/>
  <Bits = "16" XCoord = "64" YCoord = "64" ZCoord = "64" FileType="jpeg" Location="C:\Series1\Image2.jpg" ImageNumber = "2"/>
  <Bits = "16" XCoord = "64" YCoord = "64" ZCoord = "64" FileType="jpeg" Location="C:\Series1\Image3.jpg" ImageNumber = "3"/>
  <Bits = "16" XCoord = "64" YCoord = "64" ZCoord = "64" FileType="jpeg" Location="C:\Series1\Image4.jpg" ImageNumber = "4"/>
  <Bits = "16" XCoord = "64" YCoord = "64" ZCoord = "64" FileType="jpeg" Location="C:\Series1\Image5.jpg" ImageNumber = "5"/>
</Instances>

这个XML文件被读取为一个字符串并传递给一个函数。这个XML文件包含了关于特定图像文件的信息。我想从这个字符串中提取所有图像文件的位置。所以无论"location"字段的值是什么,我都需要收集所有这些值。在C#中实现这个功能的最佳方法是什么。

谢谢。

6个回答

17

最简单的方法:将其解析为XML(我建议使用LINQ to XML),然后使用XML API提取信息。没有必要自己将其视为原始字符数据。

示例:

XElement root = XElement.Parse(text);
List<string> images = root.Elements("Bits")
                          .Select(x => (string) x.Attribute("Location"))
                          .ToList();

(对于任何未包含 Location 属性的 Bits 元素,这将产生一个 null 值。)


@Jay - 如果你还不熟悉LINQ,请学习它。它将改变你对数据和数据集合的思考方式。+1 附上示例代码。 - SethO
当我尝试使用这个命令时,出现了一个错误,说“System.Xml.Linq.XElement”不包含“Select”的定义。我做错了什么吗? - Jay
好的,我很抱歉,我明白了,我使用了“Element”而不是“Elements”。 - Jay

5

请注意,你的结构不符合XElement.Parse的有效XML格式,因为你的元素没有名称,而只有属性。

一个可能正确的结构应该是:

<Instances>
<Image Bits = "16" XCoord = "64" YCoord = "64" ZCoord = "64" FileType="jpeg" Location="C:\Series1\Image1.jpg" ImageNumber = "1" />
<Image Bits = "16" XCoord = "64" YCoord = "64" ZCoord = "64" FileType="jpeg" Location="C:\Series1\Image2.jpg" ImageNumber = "2" />
<Image Bits = "16" XCoord = "64" YCoord = "64" ZCoord = "64" FileType="jpeg" Location="C:\Series1\Image3.jpg" ImageNumber = "3" />
<Image Bits = "16" XCoord = "64" YCoord = "64" ZCoord = "64" FileType="jpeg" Location="C:\Series1\Image4.jpg" ImageNumber = "4" />
<Image Bits = "16" XCoord = "64" YCoord = "64" ZCoord = "64" FileType="jpeg" Location="C:\Series1\Image5.jpg" ImageNumber = "5" />
</Instances>

以下是基于Jon Skeet上面提供的代码生成的用于解析的C#代码:
 XElement root = XElement.Parse(text);
 List<string> images = root.Elements("Image")
                           .Select(x => (string) x.Attribute("Location"))
                           .ToList();

HTH :)


3
如果您正在解析XML,请使用框架中的XML类,特别是XElement。
使用以下代码加载数据:
XElement element = XElement.Parse(myString);

然后你可以使用明确定义的API轻松地操作对象。


3
不使用字符串。如果是XML格式,则应该使用XML LINQ库来读取并查询。

1
我建议使用Linq to XML。通过一个简单的Linq查询,您可以获取位置;不需要解析。

0

你可以使用 Xpath 表达式来完成这个任务。


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