1

我有一个具有以下结构的 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 来解决这个问题吗?

我不需要一个完整的解决方案,只需要一个正确方向的提示。

4

1 回答 1

0

简单的答案是可以。也使用 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);
    }
}

对不起,我不能很好地写提示。我没有测试或编译这个,所以它可能需要一些调整。

没有捕获无限循环。如果任何子依赖引用了上线包,则将出现无限循环。

这也是非常低效的,如果每个包都记住它的依赖项等等会更快。为此,您必须为每个包创建一个类。如果您要解析的文件非常大,您应该采用这种方法。带有密钥名称的ADictionary<string, PackageClass>可能会有所帮助。

于 2012-10-03T21:38:11.797 回答