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

ヒントが上手く書けなくてすみません。私はこれをテストしたりコンパイルしたりしなかったので、微調整が必​​要かもしれません。

無限ループのキャッチはありません。子の依存関係がアップライン パッケージを参照している場合、無限ループが発生します。

これも非常に非効率的です。各パッケージがその依存関係などを記憶していれば、より高速になります。そのためには、パッケージごとにクラスを作成する必要があります。解析するファイルが非常に大きい場合は、このアプローチを使用する必要があります。Dictionary<string, PackageClass>キーの名前を持つAが役立ちます。

于 2012-10-03T21:38:11.797 に答える