簡體   English   中英

使用Linq搜索Xml文件,獲取與子節點匹配的節點

[英]Search Xml file with Linq, get nodes that match to subnodes

我有一個具有以下結構的Xml文件:

<Packages>
    <Package>
        <Name>Package1</Name>
        <Dependencies>
            <Dependency>Package2 </Dependency>
        </Dependencies>
    </Package>
    <Package>
        <Name>Package2</Name>
        <Dependencies>
            <Dependency>Package3</Dependency>
        </Dependencies>
    </Package>
    <Package>
        <Name>Package3</Name>
        <Dependencies />
    </Package>
</Packages>

我想解析Xml文件,並打印出依賴項“流”。

例如:

Package1 -> 
  Package2 ->
    Package3
Package2 ->
  Package3
Package3

目的是創建將安裝應用程序的“序列”,命令應存儲在Xml文件中。 程序包可能具有依賴性。

我可以使用Linq解決此問題嗎?

我不需要一個完整的解決方案,只是在正確方向上提供了一個提示。

簡單的答案是可以。 也使用XPath。

使用System.Xml.XPath;

您可以使用遞歸來設置它,如下所示:

XElement root = XElement.Load(file); // or .Parse(xmlString);
foreach(XElement package in root.Descendants("Package"))
{
    DoPackage(package, 0);
}

void DoPackage(XElement package, int level)
{
    StringBuilder name = new StringBuilder();
    for(int i = 0; i < level; i++) name.Append("  ");
    name.Append(package.Element("Name").Value);
    var dependencies = package.Descendants("Dependency");
    if(dependencies.Count() > 0)
        name.Append(" ->");
    Console.WriteLine(name.ToString());
    foreach(XElement dependent in dependencies)
    {
        string dependentName = dependent.Value;
        XElement dependentElement = 
            package.XPathSelectElement("//Package[Name='"+dependentName+"']");
        DoPackage(dependentElement, level + 1);
    }
}

抱歉,我不能很好地編寫提示。 我沒有測試或編譯它,因此可能需要進行一些調整。

無限循環是沒有用的。 如果有任何依賴於子項的人引用上線軟件包,則將存在無限循環。

這也是非常低效的,如果每個程序包記住其依賴項等等,將會更快。 為此,您必須為每個包創建一個類。 如果要分析的文件很大,則應采用這種方法。 具有關鍵字名稱的Dictionary<string, PackageClass>可能會有所幫助。

暫無
暫無

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

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