簡體   English   中英

動態創建 LINQ 查詢以查詢 XML 元素

[英]Dynamically Creating LINQ Query to query XML Elements

我有一個類似於下面的 XML,

<?xml version="1.0" encoding="utf-8"?>
<body>
    <Result> 
        <Students>
            <Student>
                <Firstname Value="Max" />
                <LastName Value="Dean" />
            </Student>
            <Student>
                <Firstname Value="Driz" />
                <LastName Value="Jay" />
            </Student>
        </Students>
    </Result>
</body>

我試圖弄清楚是否可以編寫一些代碼來動態構建 Linq 查詢,例如,

string pathToElements = "Result.Students.Student";
var individualItems = pathToElements.Split(".");

類似於,

XElement document = XElement.Parse(xml);
var evaluatedResult = document.Elements("Result")
                .Elements("Students")
                .Elements("Student")
                .ToList();

基本上, individualItems有 3 個項目“結果”、“學生”和“學生”。 我正在探索可能的方法來創建一個動態查詢來完成類似的事情,

document.Elements("Result")
        .Elements("Students")
        .Elements("Student")
        .ToList();

對於 n 個項目,我只需要繼續將.Elements("") 附加到查詢中。 關於如何實現這一點的任何建議,我的第一直覺是使用字符串構建器並將查詢作為字符串。 我能夠做到這一點,但無法找出如何執行字符串形式的 LINQ 查詢。 提前致謝

您可以使用 XPath 查詢 XML (它是一個字符串,因此您可以動態創建它)然后您可以反序列化該項目

https://docs.microsoft.com/en-us/troubleshoot/developer/dotnet/framework/general/query-xpathdocument-xpath-csharp

此代碼的output

using System;
using System.Xml.XPath;
using System.IO;

public class Program
{
    public static void Main()
    {
        var xml = @"<?xml version=""1.0"" encoding=""utf-8""?>
<body>
    <Result> 
        <Students>
            <Student>
                <Firstname Value=""Max"" />
                <LastName Value=""Dean"" />
            </Student>
            <Student>
                <Firstname Value=""Driz"" />
                <LastName Value=""Jay"" />
            </Student>
        </Students>
    </Result>
</body>";
        
        using (TextReader tr = new StringReader(xml))
        {
           var xdoc = new XPathDocument(tr);
           var nav = xdoc.CreateNavigator();
           var nodeIter = nav.Select("/body/Result/Students/Student");
           while (nodeIter.MoveNext()) 
           {
                Console.WriteLine("Student: {0}", nodeIter.Current.InnerXml);
           };           
        }       
    }
}

Student: <Firstname Value="Max" />
<LastName Value="Dean" />
Student: <Firstname Value="Driz" />
<LastName Value="Jay" />

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM