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