Re: трассер для хмл
От: kov_serg Россия  
Дата: 23.05.19 20:48
Оценка: 6 (1)
Здравствуйте, 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);
            });
        }
    }
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.