Как я могу получить список текста из XML-документа с помощью c #?

#c# #xml #linq #linq-to-xml

#c# #xml #linq #linq-to-xml

Вопрос:

У меня есть XML-документ, который выглядит следующим образом

 <meta>
<field type="xs-string" name="Category">جداول</field>
<field type="struct" name="Images">
    <field type="xs-string" name="FileName">A00000002.png</field>
    <field type="xs-string" name="FileName">B00000002.png</field>
    <field type="xs-string" name="FileName">C00000002.png</field>
</field>
</meta>
  

Я хочу извлечь A00000002.png B00000002.png C00000002.png в виде списка, используя XDocument. Мой код на данный момент:

 var images = (from title in doc.Root.Elements("field").Where(node => node.Attribute("name").Value.Equals("Images")) select (string)title.Value);
  

Но он возвращает только строку со всеми именами изображений рядом друг с другом… Кто-нибудь знает, как я могу получить список имен изображений, не разбирая строку на части?

Ответ №1:

вы можете использовать приведенный ниже код

  var node = doc.Descendants("field").Elements("field").Select(p=>p.Value);
  

таким образом, вы получите список имен изображений.

O/P

введите описание изображения здесь

вы можете использовать его как

  foreach (var item in node)
        {
            string value = item.ToString();
        }
  

Комментарии:

1. да, теперь это содержит список строк в «представлении результатов»… Есть идеи, как я могу получить к ним доступ?

2. Я изменил свой ответ

Ответ №2:

Используйте Split() функцию для получения массива строк и преобразования его в список, если необходимо: применимо к вашему случаю,

 string[] _arrImages = ((string)images).Split([separator])
  

где разделитель — это правильный символ-разделитель, например (‘ ‘) .
Строковый массив _ arrImages может быть преобразован с List<string> помощью применения _arrImages.ToList() функции, если это необходимо. Rgds,

Ответ №3:

Попробуйте добавить Regex.Split к результату вашего запроса :

     XElement rootElement = XDocument.Load(@"YourPath").Root;

    var images = (from title in rootElement.Elements()
                .Where(node => node.Attribute("name").Value.Equals("Images"))select (string)title.Value);

    string[] GroupsItems = Regex.Split((string)images, "png");
  

Ответ №4:

Проблема заключается в том, что вы не перечисляете Images , а вместо этого возвращаете его содержимое, которое является показанной вами строкой.

Попробуйте это:

 var images = from title in doc.Root.Elements("field").Where(node => node.Attribute("name").Value.Equals("Images")).Descendants().Where( node => node.Attribute("name").Value.Equals("FileName")) select (string)title.Value;
  

Он проходит по вспомогательным элементам за секунду Where .

Ответ №5:

Попробуйте выполнить следующее:

 var mynode = doc.Descendants("field").Elements("field").Select(f=>f.Value);