Здравствуйте, gok, Вы писали:
gok>Есть набор xml файлов, описывающих среду тестирования.
gok>Внутри таких файлов есть ссылки на папки, другие xml файлы.
gok>Среда пользуется системными переменными типа $(MYPRODUCT_PATH), ссылки могут выглядеть как:
gok>$(MYPRODUCT_PATH)\config\config.xml
gok>А равно как и абсолютными путями.
gok>Есть ли приложения для просмотра дерева ссылок? Заменить системные переменные реальными и просканировать папки-файлы
gok>Вроде несложно самому написать, но должно ж уже иметь место быть.
Данные могут очень по разному храниться в xml
using System;
using System.Xml;
using System.Text.RegularExpressions;
class Program {
static void ReadAllNodes(XmlReader xr,Action<string> handler) {
while (xr.Read()) {
if (xr.NodeType == XmlNodeType.CDATA || xr.NodeType == XmlNodeType.Text) {
foreach (var line in xr.Value.Split('\r','\n')) {
var s = line.Trim();
if (s.Length > 0) handler(s);
}
}
if (xr.NodeType == XmlNodeType.Element) {
for (int i = 0; i < xr.AttributeCount; i++) {
handler(xr[i]);
}
}
}
}
static void FindPaths(XmlReader xr,Action<string> handler) {
var re1 = new Regex(@"\$\([^)]+\)");
var re2 = new Regex(@"\.xml$",RegexOptions.IgnoreCase);
ReadAllNodes(xr,text => {
if (re1.IsMatch(text) || re2.IsMatch(text)) handler(text);
});
}
static string ExpandPath(string src,Func<string,string> expander) {
var re = new Regex(@"\$\(([^)]+)\)");
return re.Replace(src,match => expander(match.Groups[1].Value));
}
static string EnvExpander(string name) {
var res=Environment.GetEnvironmentVariable(name);
return res == null ? "$(" + name + ")" : res;
}
static void Main(string[] args) {
using (var xr = XmlReader.Create("test.xml")) {
FindPaths(xr,path => {
var fpath = ExpandPath(path,EnvExpander);
Console.WriteLine(fpath);
});
}
}
}