2016-10-03 1 views
0

Я создал XML-файл документов с несколькими тегами метаданных.Использование C# для запроса 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"; 
} 

Но это не возвращает значения для дочерних элементов, где несколько дочерних элементов с одинаковыми именами. Любая идея о том, как проверять запрос на все дочерние элементы с тем же именем?

ответ

2

Использование LINQ to 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); 
} 
+0

Awesome, спасибо! Это работает! –

Смежные вопросы