如何递归搜索XML文件?

问题描述 投票:0回答:1

我想在XML文件中搜索名称为“ Reference”的节点。这些节点的内部Text是其他xml文件。我也想为相同的节点解析这些xml文件(“参考”)。

我使用一些方法来设置我找到的引用的名称和路径,但是我不知道如何递归进行。

该类,我在其中搜索并设置在XML中找到的引用的名称和路径

public class SetReferences
{
    public SetReferences(string[] args)
    {
        XmlDocument doc = new XmlDocument();
        doc.Load(args[0]);
        XmlNamespaceManager ns = new XmlNamespaceManager(doc.NameTable);
        ns.AddNamespace("msbld", "http://schemas.microsoft.com/developer/msbuild/2003");
        XmlNodeList nodelist = doc.SelectNodes("//msbld:Reference", ns);
        foreach (XmlNode node in nodelist)
        {

            var file = new FileInfo(node.InnerText);
            AnalyzedAssembly analyzedAssembly = new AnalyzedAssembly
                {
                    AssemblyName = file.Name,
                    AssemblyFile = file
                };


                Console.WriteLine(analyzedAssembly.AssemblyName);
                Console.WriteLine(analyzedAssembly.AssemblyFile);
        }
    }
}


public class AnalyzedAssembly
{
    public string AssemblyName { get; set; }
    public FileInfo AssemblyFile { get; set; }        
    public List<AnalyzedAssembly> ChildDepencies { get; } = new List<AnalyzedAssembly>();

}

这是我的主

class Program
{
    static void Main(string[] args)
    {
        new SetReferences(args);

        Console.WriteLine("\nPress any key to exit.");
        Console.ReadKey();
    }

}

XML文件看起来像这样

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup>
    <Reference Include="DataMatrix.net, Version=1.0.0.0>
      <HintPath>..\packages\DataMatrix.net.0.4.2\lib\20\DataMatrix.net.dll</HintPath>
    </Reference>
    <Reference Include="Devart.Data, Version=5.0.1289.0>
      <HintPath>..\..\lib\ExtLib\DevArt\Devart.Data.dll</HintPath>
    </Reference>

我希望列出所有参考文献。每个参考都有一个xml文件。我想在这些文件中搜索“参考文献的参考文献”。

c# xml recursion search
1个回答
0
投票

由于我不知道这些方法的确切语法,所以我只能提供一些描述...因此,尝试将实际搜索分离为方法本身,即方法为[[bar,该方法将节点列表作为输入,与找到的节点一起使用,处理内部文本到节点并在所有子节点上调用自身符合条件的。因此,您首先要做好所有准备工作,然后调用单独的方法bar一次。

编辑:我没有编写代码或其他任何内容,因此可能会出现一些错误。我认为,这可能有助于进一步发展。

class Program { static void Main(string[] args) { new SetReferences(args); Console.WriteLine("\nPress any key to exit."); Console.ReadKey(); } private SetReferences(string[] args) { XmlDocument doc = new XmlDocument(); doc.Load(args[0]); XmlNamespaceManager ns = new XmlNamespaceManager(doc.NameTable); ns.AddNamespace("msbld", "http://schemas.microsoft.com/developer/msbuild/2003"); XmlNodeList nodelist = doc.SelectNodes("//msbld:Reference", ns); HandleNodes(nodelist); } private HandleNodes(XmlNodeList[] nodes) { foreach (XmlNode node in nodelist) { var file = new FileInfo(node.InnerText); AnalyzedAssembly analyzedAssembly = new AnalyzedAssembly { AssemblyName = file.Name, AssemblyFile = file }; Console.WriteLine(analyzedAssembly.AssemblyName); Console.WriteLine(analyzedAssembly.AssemblyFile); // Get a new nodelist from the inner XML // and call HandleNodes on this new nodelist here. } } } public class AnalyzedAssembly { public string AssemblyName { get; set; } public FileInfo AssemblyFile { get; set; } public List<AnalyzedAssembly> ChildDepencies { get; } = new List<AnalyzedAssembly>(); }

© www.soinside.com 2019 - 2024. All rights reserved.