#c# #asp.net #xml #visual-studio
#c# #asp.net #xml #visual-studio
Вопрос:
Я создал XML-файл документов с несколькими тегами метаданных.
Это выглядит примерно так:
<?xml version="1.0" encoding="utf-8" ?>
<documents>
<document>
<name>Document 1</name>
<tag>Tag 1</tag>
<tag>tag 2</tag>
<tag>Tag 3 </tag>
<tag>Tag 4</tag>
</document>
<document>
<name>Document 2</name>
<tag>Tag 1</tag>
<tag>Tag 4</tag>
<tag>Tag 5</tag>
<tag>Tag 6</tag>
</document>
<document>
<name>Document 3</name>
<tag>Tag 3</tag>
<tag>Tag 4</tag>
<tag>Tag 5</tag>
<tag>Tag 7</tag>
</document>
</documents>
Я хочу, чтобы пользователь мог вводить поисковый запрос (один из тегов) и возвращать имя всех документов, содержащих этот тег.
В настоящее время я использую следующий код для запроса моего XML:
String str = "";
var search = searchBox3.Text;
var title = "";
var xmlMetaFilePath = Server.MapPath("XML/MetaDataTest.xml");
DataSet dsMetaDetails = new DataSet();
dsMetaDetails.ReadXml(xmlMetaFilePath);// Load XML in dataset
DataTable updates = dsMetaDetails.Tables[0];
EnumerableRowCollection<DataRow> updateQuery =
from update in updates.AsEnumerable()
where update.Field<string>("tag") == search
select update;
DataView updateView = updateQuery.AsDataView();
if (updateView.Count > 0)
{
foreach (DataRow row in updateQuery)
{
title = row.Field<string>("name");
answer.Text = title;
str = str title;
}
answer.Text = str;
}
else
{
answer.Text = "None";
}
Но это не возвращает значения для дочерних элементов, где несколько дочерних элементов имеют одинаковое имя. Есть идеи о том, как проверить запрос на все дочерние элементы с одинаковым именем?
Ответ №1:
Используйте LINQ для Xml
string searchTag = "some tag";
XDocument file = XDocument.Load("filepath.xml");
var documents = file.Root
.Elements("document")
.Where(doc => doc.Elements("tag")
.Any(tag => tag.Value.Equals(searchTag));
foreach(var doc in documents)
{
string docName = doc.Element("name").Value;
Console.WriteLine(docName);
}