【问题标题】:Search Xml file with Linq, get nodes that match to subnodes使用 Linq 搜索 Xml 文件,获取与子节点匹配的节点
【发布时间】:2012-10-03 10:26:49
【问题描述】:

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

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

【问题讨论】:

    标签: c# xml linq


    【解决方案1】:

    简单的答案是可以。也使用 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&lt;string, PackageClass&gt; 可能会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多