Разбор строки в c # - PullRequest
       42

Разбор строки в c #

4 голосов
/ 28 мая 2010

Предположим, есть 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-файл содержит информацию о конкретном файле изображения. Я хочу извлечь местоположение всех файлов изображений из этой строки. Так что, каково бы ни было значение «местоположения», мне нужно собрать все эти значения. Каков наилучший способ добиться этого в C #.

Спасибо

Ответы [ 6 ]

17 голосов
/ 28 мая 2010

Самый простой способ: проанализировать его как XML (я бы предложил использовать LINQ to XML), а затем добавить информацию, используя XML API. Нет смысла рассматривать его как необработанные символьные данные самостоятельно.

Пример:

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

(Это даст нулевое значение для любого элемента Bits, который не содержит атрибута Location.)

5 голосов
/ 28 мая 2010

Будьте осторожны, ваша структура здесь не является допустимым XML для XElement.Parse, потому что у ваших элементов нет имени, а только атрибуты.

Возможная правильная структура:

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

Это приведет к следующему коду C # для синтаксического анализа - на основе кода Джона Скита сверху:

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

HTH:)

3 голосов
/ 28 мая 2010

Если вы анализируете XML, используйте классы XML в платформе, особенно XElement.

Загрузите ваши данные с

XElement element = XElement.Parse(myString);

Тогда вы можете легко манипулировать объектами с помощью хорошо определенного API.

3 голосов
/ 28 мая 2010

Не используется строка. Если это XML, прочитайте его как таковой и выполните запрос с использованием библиотек XML LINQ.

1 голос
/ 28 мая 2010

Я бы предложил использовать Linq to XML . С помощью простого запроса Linq вы можете получить Location; не нужно разбирать.

0 голосов
/ 28 мая 2010

Вы можете использовать выражение Xpath для этого

...