2016-10-03 9 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> 

私は、ユーザーが検索語(タグの1つ)を入力することができ、それはタグを持っているすべてのドキュメントの名前を返すようにしたい:

ITSは次のようになります。これは、複数の子要素が同じ名前を持っている子要素の値を返さない、

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"; 
} 

しかし:

現在、私は私のXMLを照会するには、次のコードを使用しています。同じ名前のすべての子要素に対して照会を検査する方法に関する考え方はありますか?

答えて

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

素晴らしい、ありがとう!それは動作します! –

関連する問題