我想在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文件。我想在这些文件中搜索“参考文献的参考文献”。
由于我不知道这些方法的确切语法,所以我只能提供一些描述...因此,尝试将实际搜索分离为方法本身,即方法为[[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>();
}