[英]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.